Linux中流式TCP/IP在无线Modem上丢失小包
感谢关注这个问题。
我们在Linux下开发一个网络客户端程序(服务器是不可修改的),不断向服务器不定期发送一些很小的包(一般只有几十字节),现在出现这种情况:大部分包正常发送,但是当无线Modem断开的时候,如果这个时候刚好有一个小包,就可能丢失,但在程序中却显示已经发送成功,导致丢包。
我们分析原因是这样:
1:主程序创建Socket,TCP/IP方式,并采用Stream方式
2:主程序调用Write,写入小包到系统的Socket缓冲区,并返回成功写入,由于字节数很小,所以一般都立即返回写入成功!
3:Linux TCP/IP协议栈把Socket缓冲区数据发送到服务器
如果第二步完成,刚好在第三步出现无线Modem断开的情况,就会导致主程序以为已经发送成功了,但服务器收不到的情况。
我们在网络上搜索了大量的资料,但是没有找到最终的解决方案,一般都是要求修改协议,加上对小包的ACK处理,但我们这边无法控制服务器。
我们也试着控制KeepAlive和NoDelay,但还是没效果:
//对sock_cli设置KEEPALIVE和NODELAY
len = sizeof(unsigned int);
setsockopt(sock_cli, SOL_SOCKET, SO_KEEPALIVE, &optval, len);//使用KEEPALIVE
setsockopt(sock_cli, IPPROTO_TCP, TCP_NODELAY, &optval, len);//禁用NAGLE算法
请问有什么方式可以解决这种情况?
先谢谢了。