2014-05-22 35 views
0
void download(char *file) 
{ 
    int size = getsize(file); 
    printf("Got size %d\n", size); 
    sprintf(buff, "GET %s\n", file); 
    send(sockfd, buff, strlen(buff), 0); 
    rsize = recv(sockfd, buff, 1000, 0); 
    sscanf(buff, "%d", &resultcode); 
    printf("%s", buff); 
    if (strcmp(buff, "+OK\n") != 0) 
    { 
     printf("download failed\n"); 
    } 
    FILE *dlfile = NULL; 
    if ((dlfile = fopen(file, "r")) != NULL) 
    { 
     dlfile = fopen(file, "w"); 
     do 
     { 
      rsize = recv(sockfd, buff, 1000, 0); 
      for (int i = 0; i < rsize; i++) 
      { 
       fprintf(dlfile, "%c", buff[i]); 
      } 
      size = size - rsize; 
     } while (size != 0); 
    } 
    fclose(dlfile); 
} 

我试图使下载功能打印输出的文件用户的内容,然后将其保存到当前目录。我做了一个调试行printf("%s", buff);,它打印出+OK\n(filename)。它应该打印出+OK\n。它还打印出download failed,然后出现segmentation fault错误。我错过了什么?缓冲区没有正确读取字符串

+0

你正在比较“+ OK \ n(文件名)”和“+ OK \ n”吗?他们不平等。你在找'strstr'吗? –

+1

当你阅读它时,你假设所有坐在那个插座上的都是“确定\ n”。当他们把答复提出来时,发件人正在填塞它。对于这个世界里的所有人来说都是好的,**检查你的函数调用返回值。**。面对[亨利斯宾塞的C程序员第六诫命](http://www.seebs.net/c/10com.html) – WhozCraig

回答

0

这里发生了几件事情。首先,recv和send基本上是对字节数组进行操作,所以他们不知道行结尾等等。另外请注意,recv不能保证填充缓冲区 - 它通常会读取缓冲区限制内可用的内容。对于针对“+ OK \ n”的strcmp,可以使用长度为4的strncmp,但这有点直接(见下文)。接下来请注意,buff字符串不是由recv终止的,所以你的printf很容易崩溃。

当你进入你的循环时,缓冲区已经包含了其余部分I/O。可能包含其他字段或部分文件。你也需要处理它。我不清楚getize是什么 - 但使用这个尺寸来驱动你的循环似乎是关闭的。此外,你的循环fprintf的值可以通过调用fwrite来取代。总体而言,您需要正确缓冲然后解析传入的数据流。如果你想自己做,你可以看看fdopen来获得一个FILE对象。