我有一个c ++应用程序,它使用TCP套接字将文件从一个处理器传输到另一个处理器。应用程序将在不可靠的网络上运行,因此当连接丢失并重新获得时,传输将继续运行非常重要。我使用ACE来允许应用程序在Windows或Linux上运行。
目前,当我开始传输并断开两个处理器之间的网络连接时,如果我在不到20秒的时间内重新连接它,传输将重新启动并且一切正常。如果在20秒内未重新建立连接,则出现Windows错误10054,表示连接已重置。此时,套接字消失,一旦重新建立连接,传输将不会恢复。有没有办法覆盖它,以便我可以控制何时连接超时?
编辑:这似乎是一个Windows问题。我尝试将文件从Linux VM发送到Windows机器。我在传输过程中断开了网线超过5分钟。当我重新连接时,转移就从它停止并完成的地方开始。
答案 0 :(得分:2)
我认为主题应该说如何处理,而不是如何预防,对吧?你肯定希望得到这个错误,因为(根据你的评论)此时文件传输将处于暂停状态,用户也会意识到这一点。要暂停并通知用户,您需要收到错误。
无论如何,您提到的20秒可能是由于您的操作系统/路由器超时。数量可能会有很大差异,您不应该以任何方式依赖它。您可以尝试更新路径上每个方框的超时,但这通常是不可能的,并不能真正解决您的问题(您可以始终失去连接的时间超过您设置的超时)。
为了构建一个不受超时影响的解决方案,您需要在原始连接之上使用简单的协议,并允许重新连接并从数据流的特定偏移量恢复传输。您可以修改您的客户端以发送请求,其中包含有关重新传输点的详细信息。
如果您的网络确实不可靠且经常中断,您可以切换到UDP。有些数据包会到达,有些会丢失。您可以收集块并请求重新传输尚未到达的部分数据。您可能需要花费更多时间来设计正确的协议,但解决方案可能优于标准TCP。
答案 1 :(得分:0)
虽然您可以尝试一些套接字选项,但正确的解决方案可能就是这样:
将重新连接逻辑构建到您在TCP之上实现的任何协议。
即使您将网络电缆粘合到端口,也始终可以使用套接字断开连接进行处理。因此,您可能只是专注于让您的套接字定期尝试“重新连接”,然后让您的协议知道处理这种情况。 (例如,尝试每N秒重新连接一次,每次可能等待更长时间,直到某个最大超时)。然后,对于协议特定的更改,我会在接收器应该从发送数据的哪个点开始指示发送方的前提下工作。类似于Web浏览器告诉http服务器如何恢复文件传输。