具体问题描述在这
《linux TCP服务器连接时发不出数据,断开瞬间发送全部数据》
http://bbs.eeworld.com.cn/thread-480763-1-1.html
服务器和两个客户端连接,采用epoll非阻塞方式,客户端分别发送心跳包(
6s一次),服务器发送心跳回应,接收在一个线程,人为操作服务器,每个
1S查询一次客户端业务情况,发送在另一个线程,此线程与接收线程未作互斥同步(Socket有同时写的可能)
所以服务器的两个线程大约每隔6一次数据冲突。(这是诱因)
抓包发现的确出现有一定概率的数据冲突。
冲突后,接着服务器关闭1S的查询业务,网络上只心跳包和心跳回应包。
代码上看:
每次客户端发心跳包后,服务器返回心跳回应都成功,
这两种数据包都不大,都是40byte
问题是客户端收不到任何数据
(这是我关注的问题)
抓包显示此时只有服务器端的TCP协议栈返回受到数据的ACK应答, 数据内容并不包含心跳应答???
过了1min后客户端断开连接
抓包显
示10次供400byte的心跳应答
一次性发完
同事对最后一次发送的分析是:
TCP断开会有半连接状态,主动断开放问对方是否有数据要发,有就一次性发送。