加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-16 03:32:17 所属栏目:百科 来源:网络整理
导读:我试图通过C中的套接字接收一些文件.但是服务器向我发送了一个100字节文件的64字节数据包,我在目标文件上得到大约999902字节. while ((n = read(sd,buffer_in,BUFSIZE ))) // BUFSIZE = 64 { if(n0) { printf("Fail.n"); fclose(archivo); return -1; } if(
我试图通过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,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,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 );
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读