2011-11-24 135 views
0

可能重复:
C++ Functions According to TCPTCP重传超时检测在C++

在我的Windows C++应用程序我使用的Winsock API。

我想检测我的C++函数中的网络错误。

使用wireshark我可以看到,有一个网络错误后有TCP重传数据包。

您知道如何使用C++函数检测TCP重传超时?

+1

只是好奇 - 但如果你发现TCP重传已经发生,你会怎么做呢?考虑到它将重新传输以减轻丢包问题,为什么你在意?一般来说,如果数据包丢失太大以致于连接无法获得任何字节,则在调用send/recv时,您只会收到错误或套接字关闭通知。 – selbie

+0

这是一个要求 - 我需要知道执行一系列操作的重新发送超时指示。关于发送/接收 - 在wireshark我可以看到,我得到它很长一段时间TCP重新发送超时发生后。 – gln

+0

@EJP - 它不是重复的。我想知道在C++中重新发送超时的指示。你有答案吗? – gln

回答

0

如果连接中断,所有对recv(或WSARecv)的调用都将返回错误。 TCP本身具有对协议内置的数据包的重传,所以在大多数情况下你不需要做任何事情。

如果两个对等设备之间的电缆以某种方式断开,那么您在接收时不会收到错误。然后你必须实现你自己的超时。如果您的高层协议使用请求响应(即您发送请求并且另一个对端返回响应),则很容易,如果在X秒内未收到响应,请关闭连接并重新连接。

编辑在回应的评论:

TCP有这个重发的内置,也没有办法将其关闭,或第一超时后得到一个错误。解决此问题的一种方法是使用UDP(SOCK_DGRAM)套接字代替。这个问题是你必须自己处理所有事情,包括处理超时,如果没有响应。

+0

我可以看到,recv函数在TCP重新发送超时发生后超过一分钟的时间内错误。 – gln

+0

@gln实际的超时时间可能不同,但这就是TCP的工作方式。如果一个数据包在超时时间内没有得到回复,那么TCP再次发送该数据包,如果数据包仍然没有得到回复,它会在网络堆栈中传播该错误。 –

+0

在wireshark我看到5包TCp retrasmissin,然后在他们中间有很多ARP数据包,我收到错误与recv。我不想要这个。我想在回缩超时后立即知道。 – gln

1

基本上没办法。套接字API只是不会给你这样的低级信息。您只能检测到总的连接失败。

如果你想要的是你要求的,你必须捕获网络数据包并像wireshark一样进行流量分析。否则,请说明你为什么要检测到这一点。可能是tcp keepalive或者udp就足够了。