【问题标题】:Problem in transfering file from server to client using C sockets使用 C 套接字将文件从服务器传输到客户端的问题
【发布时间】:2010-05-06 18:36:15
【问题描述】:

我想问,为什么我不能从服务器传输文件到客户端? 当我开始从服务器发送文件时,客户端程序会出现问题。 所以,我花了一些时间检查代码, 但我仍然无法找出问题所在 谁能帮我指出问题?

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

【问题讨论】:

  • -1 对问题进行一些描述会很有帮助。格式也有问题。
  • 我同意。我们需要更多信息才能开始提供帮助。另外,什么操作系统?
  • 我使用的是 ubuntu 9.10,很抱歉我是新手,我无法正确格式化它
  • 我为您修正了格式,但您仍需要准确告诉我们出了什么问题。 “它不起作用”或“程序有问题”不是问题。
  • 感谢您对它进行格式化...我觉得无法从服务器端读取文件,可能是 serverfile.c 文件中的 while 循环有问题,我的看法我不知道如果我是对的?

标签: c linux sockets client-server


【解决方案1】:

我看到了几个问题:

  • 您正在读取()和写入()套接字句柄。适用于某些操作系统,但不适用于其他操作系统。如果您完全关心可移植性(或者如果您的操作系统是读/写中断之一),您将需要 recv() 和 send()。

  • 您正在关闭()套接字句柄,而没有先关闭()它。这很可能导致最后发送的字节被丢弃。

  • fread 是一个函数,而不是一个变量。你可能希望你的循环看起来像

    while (!feof(fp)) {

更新:你在哪里设置连接地址?

【讨论】:

  • thanx cHao 实际上是 while(!feof(fp)){ 但我错误地将其设置为 while(fread
  • 除了已经说过的,如果不知道您遇到了什么样的问题,我无法告诉您太多。
  • 我觉得我无法从服务器端读取文件,可能 serverfile.c 文件中的 while 循环应该有问题,我的观点我不知道我是否正确?跨度>
  • 所以我想我会改变 while(!feof(fp)){ 到 while( fread(fp,numbytes, ) != 0 ) { 但我的问题是我应该在 FILE *stream 中使用什么在上面改了while循环?
  • 您可以尝试将 while 更改为... while (numbytes = fread(....)) { .
【解决方案2】:

与其他任何东西不同,fread 是函数的名称,计算结果为非零函数指针值。所以:

 while(fread < 0){

永远不可能是真的。

【讨论】:

  • 哦,很抱歉实际上是 while(!feof(fp)){ 是我现在编辑的错误...我猜问题出在 while 循环附近?
  • @cool feof() 也是错误的——你几乎不应该使用它。相反,只要 fread 返回非零,就循环。
  • 比如我如何在while循环中使用fread?你能把语法给我吗
猜你喜欢
  • 1970-01-01
  • 2012-06-30
  • 1970-01-01
  • 2012-07-13
  • 1970-01-01
  • 1970-01-01
  • 2011-09-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多