【问题标题】:sending more than 65536 byte with TCP applications使用 TCP 应用程序发送超过 65536 个字节
【发布时间】:2013-04-12 16:39:11
【问题描述】:

我想知道,将文本文件从发送方传输到接收方的两个简单程序如何发送超过 65536 字节(IP 数据包的最大大小)。 这是发件人:

 FILE *fp=fopen("file_to_send.txt","r");
 char msg[65536];
 len = strlen(msg)+1;
 nwrite=0;
 printf ("write()\n");
 fflush(stdout);
 do{
   n=write(socketfd, &(msg[nwrite]), len-nwrite);
   nwrite+=n;
 }
 while( (n<0) && (errno==EINTR) );

这是接收者:

#define MAXSIZE 65536
.....
char buf[MAXSIZE];
nread=0;
do{ 
  n=read(socketfd, &(buf[nread]), MAXSIZE ) ;
  fflush(stdout);
  nread+=n;
}while( (n<0) && (errno==EINTR) );

如果 file_to_send 的权重小于 65536,它会起作用,但如果它更大,我会丢失部分文本。 对不起我的英语不好。

【问题讨论】:

  • 我假设这不是完整的代码,因为您没有将任何内容读入缓冲区(因此 strlen 调用将未定义)。
  • @JoachimPileborg 是的,这还不是全部,我只写了有写入和读取的部分,因为我认为问题就在那里......也许
  • 标题看不懂。 TCP 套接字传输字节流而不是消息或数据包。 TCP 可以轻松传输大于 64KB 的文件。如果丢失数据存在问题,那是在您的理解、协议或实现中。
  • @MartinJames 所以你的意思是我可以声明数组 msg 和 buf 大于 65536 并一次性发送?我以为我必须声明 65536 导致 ip 数据包大小的原因,是不是错了?
  • Martin James 是正确的 - 数据包大小不是限制因素。以太网上的数据包也是 1500 字节(原始,数据大小会更小)。非标准 Jumbo 帧更大 (en.wikipedia.org/wiki/Jumbo_frame),但小于 64KB。

标签: c sockets tcp ip


【解决方案1】:

什么是 MAXSIZE?

在接收器中,您收到的 MAXSIZE 可能大于缓冲区本身。

您应该在每个循环中将缓冲区传输到标准输出,这样缓冲区中始终有空间供下一次读取。

char buf[65536];
nread=0;
do{ 
  n=read(socketfd, buf, 65536);
  if (n > 0) {
    n=write(stdout, buf, n);
    fflush(stdout);
    nread+=n;
  }
} while( (n>0) || (errno==EINTR) );

还要检查 Davide Berra 的答案以修复发送方和接收方中的循环条件。

【讨论】:

    【解决方案2】:

    while 控件有问题。

    如果write函数成功,它将返回一个值greater than 0,那么你的循环将在第一次写入后退出。

    大致上,你应该改变这一行

     while( (n<0) && (errno==EINTR) );
    

     while( n>0 || error==EINTR );
    

    ...read 侧也是如此

    【讨论】:

    • 虽然 EINTR 仍然需要处理,否则您最终可能会得到低于预期的结果。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-13
    相关资源
    最近更新 更多