为什么socket接收大数据的时候接收不完全,出现丢包?
(1)TCP协议通信,接收方接收数据的前后次序与发送方一致,但数据包不一定一致。打个比方,发送方按顺序发送了2个数据包,接收可能仅接收1次就能全部收到,也可能需要收2次才能收到,也可能收3次,每次收到的数据大小不一定和发送方发送的数据包大小一样,但最终收到的总数据是一致的。
【为什么socket接收大数据的时候接收不完全,出现丢包()】(2)从你的程序来看,客户端连续发送2包数据,服务器端有可能一次就全部接到,也可能分2次收到,也可能会收2次以上才能收到。如果在发送“########helloworld”和“######whatisit”之间增加一些延时语句,比如延时1秒,那么可以肯定服务器端只能收到1次,因为在发送第1包数据的时候,服务器端就接收到一次数据,而在发送第2包数据时,服务器已经不再有接收动作了。就现在的客户端程序来说,如果要在服务器端收到所有数据,可以考虑在服务器端循环接收数据,拼装数据,直到收不到数据为止,然后输出所有接收到的数据。
while(1)
{
int rr;
sock_fd = accept( sock, NULL, NULL);
retval = 0;
while(1)
{
rr = recv( sock_fd, buf1, MAX_BUFLEN, 0 );
if(rr==0) break;
memcpy(buf+retval,buf1,rr);
retval+=rr;
}
printf("buf= %s\n ##retval=%d\n",buf,retval);
write(sock_fd,"get the call\n",sizeof("get the call\n")-1);
}
查到个函数ioctlsocket
while(1)
{int rr;
sock_fd = accept( sock, NULL, NULL);
retval = 0;
int iMode = 1;
//0:阻塞
ioctlsocket(sock_fd,FIONBIO, (u_long FAR*) &iMode);
//非阻塞设置
while(1) { ....... }
........
}
推荐阅读
- Mybatis|Mybatis面试题
- 前端|Web前端面试题
- 面试题之Mybatis基础
- java|2020Java初级面试题一数据库
- java|2020Java初级面试题一Java基础
- 阿里一面、二面路过,,口水都说干了。
- 腾讯安全技术岗校招一面--游戏安全部门之评论
- 算法|LeetCode ZigZag Conversion 解题报告
- 数据结构|数组系列面试题