2010-05-06 2 views
0

서버에서 클라이언트로 파일을 전송할 수없는 이유는 무엇입니까? 서버에서 파일을 보내기 시작할 때 클라이언트 측 프로그램에 문제가 있습니다. 그래서 코드를 확인하기 위해 약간의 시간을 할애합니다. 하지만 여전히 문제를 찾을 수 없습니다. 누구든지 나를 위해 문제를 지적 할 수 있습니까?C 소켓을 사용하여 서버에서 클라이언트로 파일을 전송할 때 문제가 발생합니다.

CLIENTFILE.C

#include stdio.h 
#include stdlib.h 
#include time.h 
#include netinet/in.h 
#include fcntl.h 
#include sys/types.h 
#include string.h 
#include stdarg.h 
#define PORT 5678 
#define MLEN 1000 
int main(int argc, char *argv []) 
{ 

     int sockfd; 
     int number,message; 
     char outbuff[MLEN],inbuff[MLEN]; 
     //char PWD_buffer[_MAX_PATH]; 
     struct sockaddr_in servaddr; 
     FILE *fp; 
     int numbytes; 
     char buf[2048]; 



     if (argc != 2) 
       fprintf(stderr, "error"); 

     if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0) 
       fprintf(stderr, "socket error"); 

     memset(&servaddr, 0, sizeof(servaddr)); 
     servaddr.sin_family = AF_INET; 
     servaddr.sin_port = htons(PORT); 

     if (connect(sockfd, (struct sockaddr *) &servaddr, sizeof(servaddr)) < 0) 
       fprintf(stderr, "connect error"); 

     if ((fp = fopen("/home/na/nall9047/write.txt", "w")) == NULL){ 
       perror("fopen"); 
       exit(1); 
     } 
     printf("Still NO PROBLEM!\n"); 

     //Receive file from server 
     while(1){ 
       numbytes = read(sockfd, buf, sizeof(buf)); 
       printf("read %d bytes, ", numbytes); 

       if(numbytes == 0){ 
         printf("\n"); 
         break; 
       } 
       numbytes = fwrite(buf, sizeof(char), numbytes, fp); 
       printf("fwrite %d bytes\n", numbytes); 
     } 

     fclose(fp); 
     close(sockfd); 
     return 0; 
} 

SERVERFILE.C 다른 어떤에서

#include stdio.h 
#include fcntl.h 
#include stdlib.h 
#include time.h 
#include string.h 
#include netinet/in.h 
#include errno.h 
#include sys/types.h 
#include sys/socket.h 
#includ estdarg.h 
#define PORT 5678 
#define MLEN 1000 
int main(int argc, char *argv []) 
{ 

     int listenfd, connfd; 
     int number, message, numbytes; 
     int h, i, j, alen; 
     int nread; 
     struct sockaddr_in servaddr; 
     struct sockaddr_in cliaddr; 
     FILE *in_file, *out_file, *fp; 
     char buf[4096]; 



     listenfd = socket(AF_INET, SOCK_STREAM, 0); 
     if (listenfd < 0) 
       fprintf(stderr,"listen error") ; 

     memset(&servaddr, 0, sizeof(servaddr)); 
     servaddr.sin_family  = AF_INET; 
     servaddr.sin_addr.s_addr = htonl(INADDR_ANY); 
     servaddr.sin_port  = htons(PORT); 

     if (bind(listenfd, (struct sockaddr *) &servaddr, sizeof(servaddr)) < 0) 
       fprintf(stderr,"bind error") ; 



     alen = sizeof(struct sockaddr); 
     connfd = accept(listenfd, (struct sockaddr *) &cliaddr, &alen); 

     if (connfd < 0) 
       fprintf(stderr,"error connecting") ; 

     printf("accept one client from %s!\n", inet_ntoa(cliaddr.sin_addr)); 

     fp = fopen ("/home/na/nall9047/read.txt", "r"); // open file stored in server 

     if (fp == NULL) { 
       printf("\nfile NOT exist"); 
     } 

     //Sending file 
     while(!feof(fp)){ 

       numbytes = fread(buf, sizeof(char), sizeof(buf), fp); 
       printf("fread %d bytes, ", numbytes); 
       numbytes = write(connfd, buf, numbytes); 
       printf("Sending %d bytes\n",numbytes); 
     } 

     fclose (fp);  
     close(listenfd); 
     close(connfd); 
     return 0; 
} 
+3

-1 일부 문제에 대한 설명이 유용 할 것입니다. 또한 형식이 잘못되었습니다. – WildCrustacean

+0

동의합니다. 도움을 받기 전에 더 많은 정보가 필요합니다. 또한, 어떤 운영 체제입니까? –

+0

우분투 9.10을 사용하고 있습니다. 미안합니다. 초보자입니다. 제대로 포맷 할 수 없었습니다. – SuperMan

답변

1

문제의 몇 내가 볼 : 당신은 소켓 핸들을 보내고)() ING를 읽고 (쓰기있어

  • . 일부 OS에서는 작동하지만 다른 OS에서는 작동하지 않습니다. 이식성에 대해 신경 쓰면 (또는 OS가 읽기/쓰기 중단 중 하나 인 경우) recv() 및 send()를 대신 수행해야합니다.

  • 먼저 소켓 핸들을 shutdown()하지 않고 닫고() 있습니다. 그러면 마지막으로 보낸 바이트가 삭제 될 수 있습니다.

  • fread는 변수가 아니라 함수입니다. (! 무엇이 일어 났는지를 결정하기 위해 feof (FP)) : 사용자가 연결 주소를 설정하는 당신은 아마 당신의 루프가

    동안 {

UPDATE처럼보고 싶어?

+0

고맙습니다 차오 실제로는 (! 무엇이 일어 났는지를 결정하기 위해 feof (FP)) { 동안하지만 난 실수로 넣어 while (fread <0) while은 코드에서 변경되었습니다.이 while 루프에서 실수가있는 것 같습니까? – SuperMan

+0

이미 말한 내용을 제외하고, 어떤 종류의 문제인지 알지 못하면 많이 말할 수 없습니다. – cHao

+0

나는 서버 측에서 파일을 읽을 수 없다고 느낍니다. serverfile.c 파일에 루프가있는 동안 문제가있을 수 있습니다.이 경우 내보기가 맞지 않을까요? – SuperMan

0

아파트는 FREAD 함수의 이름입니다 0이 아닌 함수 포인터 값으로 평가한다. 따라서 :

while(fread < 0){ 

은 사실 일 수 없습니다.

+0

오, 죄송합니다. 실제로는 입니다. (! feof (fp)) { 실수로 편집했습니다 ... while 루프에 문제가있는 것 같습니까? – SuperMan

+0

@cool feof()도 잘못되었습니다. 거의 사용하지 않아야합니다. 대신 fread가 0이 아닌 한 루프하십시오. –

+0

어떻게 while 회 돌이에서 fread를 사용합니까? 수 U PLS 내놔 synatx – SuperMan

관련 문제