我想知道,如何将两个简单的程序从发送方传输到接收方,发送超过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权重是&lt;而不是65536但如果它更大,我会失去部分文字。 抱歉我的英语不好。
答案 0 :(得分:1)
什么是MAXSIZE?
在接收器中,您接收的MAXSIZE可能大于缓冲区本身。
你应该在每个循环中将缓冲区转移到stdout,这样你在缓冲区中总是有空间用于下一次读取。
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在发送者和接收者中修复循环条件的答案。
答案 1 :(得分:0)
while
控件出现问题。
如果write
函数成功,它将返回值greater than 0
,然后您的循环将在第一次写入后退出。
粗略地说,你应该改变这一行
while( (n<0) && (errno==EINTR) );
与
while( n>0 || error==EINTR );
...和read
方