0

我有一个 c++ 应用程序,它使用 TCP 套接字将文件从一个处理器传输到另一个处理器。应用程序将在不可靠的网络上运行,因此在连接丢失和重新恢复时继续传输非常重要。我正在使用 ACE 来允许应用程序在 Windows 或 Linux 上运行。

目前,当我开始传输并断开两个处理器之间的网络连接时,如果我在不到 20 秒的时间内重新连接它,传输就会恢复并且一切正常。如果在 20 秒内没有重新建立连接,我会收到 Windows 错误 10054,表明连接已被重置。那时,套接字消失了,一旦重新建立连接,传输将不会恢复。有没有办法覆盖它,以便我控制连接何时超时?

编辑:这似乎是一个 Windows 问题。我尝试将文件从 Linux VM 发送到 Windows 机器。我在传输过程中断开了网络电缆超过 5 分钟。当我重新连接它时,传输在它停止的地方继续并完成。

4

2 回答 2

2

我相信主题应该说如何处理,而不是如何预防,对吗?您肯定希望收到此错误,因为(根据您的评论)此时文件传输将处于暂停状态,并且用户也会意识到这一点。为了暂停并通知用户,您需要得到一个错误。

无论如何,您提到的 20 秒可能是由于您的操作系统/路由器超时。该数字可能会有很大差异,您不应以任何方式依赖它。您可以尝试更新路径上每个框的超时,但这通常是不可能的,也不能真正解决您的问题(您总是会失去连接的时间超过您设置的超时时间)。

为了构建不受超时影响的解决方案,您需要在原始连接之上建立一个简单的协议,并允许从数据流的特定偏移量重新连接和恢复传输。您可以修改您的客户端以发送包含重传点详细信息的请求。

如果您的网络确实不可靠并且经常中断,您可以切换到 UDP。有些数据包会到达,有些会丢失。您可以收集块并请求重新传输尚未到达的部分数据。您可能需要花更多时间来设计正确的协议,但该解决方案可能优于标准 TCP。

于 2012-07-06T17:07:54.550 回答
0

虽然您可能可以尝试一些套接字选项,但正确的解决方案可能是:

将重新连接逻辑构建到您在 TCP 之上实现的任何协议中。

即使您将网络电缆粘到端口中,您也总是需要处理套接字断开连接。因此,您不妨只专注于让您的套接字定期尝试“重新连接”,然后让您的协议意识到处理这种情况。(例如,尝试每 N 秒重新连接一次,每次可能等待更长时间,直到某个最大超时)。然后对于协议特定的更改,我会假设接收者应该从什么时候开始传输数据来指示发送者。类似于 Web 浏览器如何告诉 http 服务器如何恢复文件传输。

于 2012-07-07T04:39:59.920 回答