微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

与TCP套接字非常奇怪的断开连接

简而言之:服务器成功调用:: send(),但数据不会在电缆上传出。 客户端在几秒钟后发送它的quit命令,因为它没有收到任何东西,并且该命令被服务器正确接收。

详细信息:服务器每隔1/10秒向客户端发送一个命令,每秒发一次心跳。 客户只能回应心跳。 我们修改了服务器应用程序来logging发送和接收的每个命令,并且我们用Wiresharklogging了PC的stream量。 我们可以将每个logging的命令匹配到一个TCP数据包,直到问题发生。这个问题一次只影响一个客户端。 数据继续与其他客户正常stream动。 连接通常在出现问题前几分钟就可以工作。 连接应该从客户端启动到closures(即几天)的时刻起作用。

发生问题时,日志文件包含所需的命令,但Wireshark转储不包含任何内容。 下面的图片显示一个客户端的stream量。 红线表示stream量停止,但服务器继续成功调用:: send()。

大约4秒后,客户端超时并closures连接。 它发送一个退出命令,服务器正常接收。

更让我困惑的是,包含quit命令的数据包没有用TCP ACK数据包进行确认。 就好像TCP连接在发送端被完全阻塞一样。 重传是这种阻塞的结果,但即使是build立新连接的TCP SYN也没有正确处理,并且不能获得简单的TCP ACK。

一个操作尝试的东西不是一个套接字(尝试修复了很多)

epoll的EPOLLEXCLUSIVE模式如何与电平触发进行交互?

Windows Socket无法绑定VPN IP地址

我们是否需要添加locking接收/发送/closures代码线程之间相同的sockets

在C中查询最大套接字发送缓冲区大小?

大约30秒后,问题消失,SYN数据包最终被接受,通信继续进行新的连接。

这已在各种Windows版本上进行了testing。 在testing过程中,使用了远程桌面会话,并且由于同样的问题,它永远不会断开连接。 它保持连接几个小时没有任何问题。 当客户端通过无线网桥时,问题更为频繁。 我们在无线terminal的两端使用了Wireshark,我们看不到任何重传或丢包,这可以解释更高的断开速率。

当许多客户端连接到同一个网桥时,他们不会同时失败。 一次只有一个。 所以无线噪声似乎不是一个解释。 我们可以在Wireshark转储中看到一些重传,但是通信仍然照常进行,并且在问题发生之前没有重传。 接入点连接到服务器的交换机。 客户端PC和服务器PC不使用无线网卡。

长期以来,我们强调networking偶尔会造成断线,但越来越多的设备是无线的,断线现象频繁,给用户带来了问题。

我们尝试使用和不使用Windows防火墙。 即使防火墙被禁用,我们也添加了端口exception。 客户端或服务器都没有防病毒软件。

我应该实现自己的TCP / IP套接字超时?

如何使用本地networking系统控制Pd Vanilla> 0.46的VLC?

什么原因以及如何避免,和

Linux – TCP连接()与ETIMEDOUT失败

接收到FIN数据包时,套接字接收stream是否closures?

http://tldp.org/HOWTO/html_single/TCP-Keepalive-HOWTO/#usingkeepalive可能有帮助。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐