在我的Windows C++应用程序我使用的Winsock API。
我想检测我的C++函数中的网络错误。
使用wireshark我可以看到,有一个网络错误后有TCP重传数据包。
您知道如何使用C++函数检测TCP重传超时?
在我的Windows C++应用程序我使用的Winsock API。
我想检测我的C++函数中的网络错误。
使用wireshark我可以看到,有一个网络错误后有TCP重传数据包。
您知道如何使用C++函数检测TCP重传超时?
如果连接中断,所有对recv
(或WSARecv
)的调用都将返回错误。 TCP本身具有对协议内置的数据包的重传,所以在大多数情况下你不需要做任何事情。
如果两个对等设备之间的电缆以某种方式断开,那么您在接收时不会收到错误。然后你必须实现你自己的超时。如果您的高层协议使用请求响应(即您发送请求并且另一个对端返回响应),则很容易,如果在X秒内未收到响应,请关闭连接并重新连接。
编辑在回应的评论:
TCP有这个重发的内置,也没有办法将其关闭,或第一超时后得到一个错误。解决此问题的一种方法是使用UDP(SOCK_DGRAM
)套接字代替。这个问题是你必须自己处理所有事情,包括处理超时,如果没有响应。
基本上没办法。套接字API只是不会给你这样的低级信息。您只能检测到总的连接失败。
如果你想要的是你要求的,你必须捕获网络数据包并像wireshark一样进行流量分析。否则,请说明你为什么要检测到这一点。可能是tcp keepalive或者udp就足够了。
只是好奇 - 但如果你发现TCP重传已经发生,你会怎么做呢?考虑到它将重新传输以减轻丢包问题,为什么你在意?一般来说,如果数据包丢失太大以致于连接无法获得任何字节,则在调用send/recv时,您只会收到错误或套接字关闭通知。 – selbie
这是一个要求 - 我需要知道执行一系列操作的重新发送超时指示。关于发送/接收 - 在wireshark我可以看到,我得到它很长一段时间TCP重新发送超时发生后。 – gln
@EJP - 它不是重复的。我想知道在C++中重新发送超时的指示。你有答案吗? – gln