Проблема при передаче файла с сервера на клиент с использованием сокетов C - PullRequest
0 голосов
/ 06 мая 2010

Я хочу спросить, почему я не могу передать файл с сервера на клиент? Когда я начну отправлять файл с сервера, у программы на стороне клиента будут проблемы. Итак, я провожу несколько раз, чтобы проверить код, Но я до сих пор не могу выяснить проблему Кто-нибудь может указать на проблему для меня?

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;
}

Ответы [ 2 ]

1 голос
/ 06 мая 2010

Я вижу пару проблем:

  • Вы читаете () и пишете () с помощью дескриптора сокета. Работает на некоторых ОС, но не на других. Вместо этого вы захотите использовать recv () и send (), если вас вообще волнует переносимость (или если ваша операционная система - одна из тех, на которых происходит чтение / запись).

  • Вы закрываете () ручку сокета без выключения () сначала. Это может привести к тому, что последние отправленные байты будут отброшены.

  • fread - это функция, а не переменная. Возможно, вы хотите, чтобы ваш цикл выглядел как

    while (! Feof (fp)) {

ОБНОВЛЕНИЕ: Где вы устанавливаете адрес для подключения?

0 голосов
/ 06 мая 2010

Appart от чего-либо еще, fread - это имя функции, которое оценивается как ненулевое значение указателя на функцию. Итак:

 while(fread < 0){

никогда не может быть правдой.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...