0

我想知道,两个将文本文件从发送方传输到接收方的简单程序如何发送超过 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,它会起作用,但如果它更大,我会丢失部分文本。对不起,我的英语不好。

4

2 回答 2

1

什么是最大尺寸?

在接收器中,您收到的 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 的答案以修复发送者和接收者中的循环条件。

于 2013-04-19T14:27:11.503 回答
0

你的while控制有问题。

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

粗略地说,你应该改变这一行

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

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

...read侧面也一样

于 2013-04-19T10:16:20.680 回答