2013-09-28 43 views
0

下面的代码适用于最后一个数据包包含的数据少于最大长度的较小文件,该功能通过显示接收到的文件正确退出。 如果传输的文件的最后一个数据包或缓冲区包含与我的情况下接收缓冲区阵列512的大小相同的确切数量。然后程序继续等待下一个数据包。客户端服务器在较大的文件的c文件传输问题

在我的情况下,所有尺寸倍数为512的文件都卡住了。 下面是代码:用于接收

客户端代码:

void receiveFile() { 
printf("inside receiveFile method\n"); 
char* fr_name = "final.txt"; 
int i; 
FILE *fr = fopen(fr_name, "a"); 
int LENGTH = 512; 
int fileLength=0; 
char revbuf[LENGTH]; 
if (fr == NULL) { 
    printf("File %s Cannot be opened.\n", fr_name); 
} else { 
    printf("starting to write the file\n"); 
    bzero(revbuf, LENGTH); 
    int fr_block_sz = 0; 
    i=0; 

    while ((fr_block_sz = recv(4, revbuf, LENGTH, 0)) > 0) { 
     fileLength+=fr_block_sz; 
     i++; 
     printf("Received buffer: %d, %d\n",fr_block_sz,i); 

     int write_sz = fwrite(revbuf, sizeof(char), fr_block_sz, fr); 

     if (write_sz < fr_block_sz) { 
      error("File write failed.\n"); 
     } 
     bzero(revbuf, LENGTH); 
     if (fr_block_sz == 0 || fr_block_sz != 512) { 
      break; 
     } 

    } 
    if (fr_block_sz < 0) { 
     if (errno == EAGAIN) { 
      printf("recv() timed out.\n"); 
     } else { 
      fprintf(stderr, "recv() failed due to errno = %d\n", errno); 
     } 
    } 
    printf("FILE RECEIVED....Total Bytes received:%d \n",fileLength); 
} 
fclose(fr); 

}

服务器,用于接收文件:

void sendFile() { 
printf("inside sendFile method\n"); 
char* fs_name = "mb.txt"; 
int LENGTH = 512; 
int sfileLength=0; 
char sdbuf[LENGTH]; 
int i=0; 
printf("[Client] Sending %s to the Server... \n", fs_name); 
FILE *fs = fopen(fs_name , "r"); 
if (fs == NULL) { 
    perror("ERROR: File not found.\n"); 
    exit(1); 
} 

bzero(sdbuf, LENGTH); 
int fs_block_sz; 
while ((fs_block_sz = fread(sdbuf, sizeof(char), LENGTH, fs)) > 0) { 
    i++; 
    printf("Sent:%d , %d \n", fs_block_sz,i); 
    sfileLength+=fs_block_sz; 
    if (send(4, sdbuf, fs_block_sz, 0) < 0) { 

     fprintf(stderr, "ERROR: Failed to send file %s. (errno = %d)\n", 
       fs_name, errno); 
     break; 
    } 
    bzero(sdbuf, LENGTH); 
} 
printf("File sent.... Total Bytes:%d\n", sfileLength); 
fclose(fs); 

}

回答

2
if (fr_block_sz == 0 || fr_block_sz != 512) { 
    break; 
} 

删除此代码。由于'while'条件,测试的第一部分永远不会是真的,而第二部分由于相同的原因是不必要的。

+0

我删除了上面提到的代码片段,但它仍然没有工作..它像之前收到文件,但仍然在等待接收..下面的行根本不执行.. printf(“FILE RECEIVED ... 。收到的总字节数:%d \ n“,fileLength); – sean

相关问题