通过套接字传输文件,最终大小用较少的字节

我试图通过C中的套接字接收一些文件。但是服务器向我发送一个100字节文件的64字节数据包,我在目标文件上得到大约999902字节。

while ((n = read(sd, buffer_in, BUFSIZE ))) // BUFSIZE = 64 { if(n<0) { printf("Fail.\n"); fclose(archivo); return -1; } if(fwrite(buffer_in, n, 1, f) !=1 ) { printf("fwrite error.\n"); fclose(archivo); return -1; } bytes+=n; } printf("We received %d bytes", bytes); 

当通过本地TCP / IP套接字使用时,它可以工作,但不能以慢速连接。 我通过调试看到我得到了很多64字节的块,并且在EOF附近有一个30字节的块。 我知道你可以在read()上获得更少的字节,因为当任何数据(> 1个字节)可用时调用返回。 但这种情况不应该被暂时抓住? 应该在n == 0时返回,那就是不再有数据(EOF)。

谢谢你的帮助。

(编辑)

发送代码如下:

 while (n=read(file_fd, buffer, BUFSIZE)) { write (sdaccept, buffer, n) } 

我知道read()和write()都可以返回N <BUFSIZE,但是这个循环不应该相应地计算出来吗? 我加了n并返回1000000,确切的大小。

(编辑II)

使用10673字节的C源测试,接收10575没有损坏,除了目标文件LACKS前98字节!

提供的发送代码忽略了socket上的write()(或send())没有义务写入整个缓冲区的事实。

如果底层子系统拒绝接收更多数据(例如,网络子系统可能有一个队列供数据发送且此队列已满),则write()/ send()可能决定部分写入或根本不写入。 这很可能是因为连接速度慢。

发送方应检查write()的返回值,以检测实际写入的数据量并进行相应调整。

写应该以某种方式完成,如下所示:

 int readAmount; while( readAmount = read(file_fd, buffer, BUFSIZE) > 0 ) { int totalWritten = 0; do { int actualWritten; actualWritten = write (sdaccept, buffer + totalWritten, readAmount - totalWritten); if( actualWritten == - 1 ) { //some error occured - quit; } totalWritten += actualWritten; } while( totalWritten < readAmount ); }