该文 客户端发送RST报文的场景是 一个客户端只能向一台服务器发送TCP报文,即一个客户端只能连接一个服务器 并且是使用有线连接的方式的
问题描述
客户机10.1.37.99向服务器10.1.37.119:8000 发送数据 ,但是一段时间后客户端不给服务器发送TCP Keep-Alive ACK了??但是网络物理拓扑又是有线连接的方式,按道理是不存在网络环境很差的问题。 很懵????
方案一:通过错误和状态信号,进行重连操作 (未解决)
嘿~ 这时在谷歌上找到一个解决方案:
于是在TcpSocket中,建立两个信号与槽
呜~ 遗憾的是客户机发送RST报文时,并没有触发这两个信号??? 反正总之是槽函数中的打印函数没有输出不知道问什么 哭死
方案二:TCP选项之SO_LINGER (可恶 还是未解决)
这时又去找客户机为啥会发出RST报文,找到了个TCP选项之SO_LINGER
设置函数close()关闭TCP连接时的行为。缺省close()的行为是,如果有数据残留在socket发送缓冲区中则系统将继续发送这些数据给对方,等待被确认,然后返回。
l_onoff为0,则该选项关闭,l_linger的值被忽略,close()用上述缺省方式关闭连接。
结果输出:
l_onoff=0,l_linger=0。 那就不应该是缓冲数据未发完,导致异常结束的问题。 可恶 还是没有解决!!!
方案三:更换客户端的IP (yue了 解决)
再定睛一看,发现客户端10.1.37.99一直在向服务端2100端口发送SYN报文,服务端一直没有给客户端响应。
但是使用netstat命令 查看网络连接情况,主机服务端并没有2100端口被使用。
客户机:
主机(服务端):
估计是IP冲突了,有人也在用内网的10.1.37.99!!! ,这时候换一个可用IP10.1.37.212,再用Wireshark侦听,就得到了纯净的网络信息了
至此,问题得到解决!!!!