C++ - 程序在尝试在 TCP 客户端上连接到不存在的地址时表现出奇怪的行为



在Visual Studio 2015中使用可配置数量的TCP连接到不同客户端来处理项目。在具有封闭网络的代表性硬件设置上运行时注意到奇怪的行为。

假设每个TCP连接都指向一个有效的其他地址,则程序运行良好,可以根据需要向所有不同的客户端发送和接收消息。然而,如果我拔下其中一台机器的插头,服务器就会发出嘎嘎声。最明显的迹象(尽管不是由此引起的唯一问题)是我们的一个UDP套接字,它应该以10hz接收消息,大约在1hz开始接收。这将一直持续到您将丢失的计算机重新连接到网络为止。奇怪的是,在这一点上,前面提到的UDP套接字将快速接收并处理它在停机期间应该接收的所有消息。之后,程序将再次正常运行。

我在家里考虑这个问题,所以我没有源代码可以发布(无论如何,这样做可能会让人反感),但我不熟悉无效TCP连接会导致这种行为的原因。有人经历过类似的事情,在这种情况下有什么对他们有用的东西吗?

当您尝试连接到TCP套接字时,UDP消息没有以正常速率发送,这表明您对两个操作都使用了相同的线程。

旁白:我保证那些"擅离职守"UDP消息没有被发送。UDP消息不会在网络中徘徊等待传递。

如果发出TCP连接请求的线程与推送UDP消息的线程是同一个线程,则您发现了问题。您需要考虑到阻塞TCP连接请求可能会长时间阻塞线程这一事实。解决方案包括使用非阻塞连接请求,或为TCP和UDP启动单独的线程。哪种方法最有效取决于您的设计。

[考虑使用ASIO,它为处理非阻塞I/O提供了一个很好的工具,但它可能需要对应用程序进行重大的重新设计。]

不幸的是,这只是猜测。我们至少需要看到一些相关的代码,以提供一个明确的答案。

最新更新