C++ 中的 TCP 重传超时检测

发布于 2024-12-17 16:26:23 字数 325 浏览 1 评论 0原文

可能的重复:
根据 TCP 的 C++ 函数

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

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

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

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

Possible Duplicate:
C++ Functions According to TCP

In my windows C++ application I'm using winsock API.

I want to detect network errors in my C++ functions.

Using wireshark I can see that after there is a network error there are TCP retransmission packets.

Do you know how can I detect TCP retransmission timeouts with C++ functions?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

七分※倦醒 2024-12-24 16:26:23

基本上没有办法。套接字 API 不会为您提供如此低级的信息。您只能检测完全连接故障。

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

Basically, no way. Sockets API just do not give you such low-level information. You can only detect total connection failure.

If you want EXACTLY what you asking for, you have to capture network packets and do flow analysis like in wireshark. Otherwise, please clarify why do you want to detect this. May be tcp keepalive or udp will suffice.

2024-12-24 16:26:23

如果连接断开,所有对 recv(或 WSARecv)的调用都将返回错误。 TCP 本身在协议中内置了数据包重传功能,因此在大多数情况下您实际上不需要执行任何操作。

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

编辑 回应评论:

TCP内置了这个重传,没有办法关闭它,或者在第一次超时后出错。解决此问题的一种方法是使用 UDP (SOCK_DGRAM) 套接字。这样做的问题是您必须自己处理所有事情,包括在没有响应的情况下处理超时。

If the connection is broken, all calls to recv (or WSARecv) will return an error. TCP itself have retransmission of packets built into the protocol, so you don't really have to do anything in most cases.

If the cable between the two peers is broken some way, then you won't get an error when receiving though. Then you have to implement your own timeout. If your higher-level protocol is using request-response (i.e. you send a request and the other peer returns a response) it is easy, if no response is received within X seconds, then close the connection and reconnect.

Edit In response to the comments:

TCP has this retransmission built-in, there is no way to turn it off, or get an error after the first timeout. One way to solve this is to use UDP (SOCK_DGRAM) sockets instead. The problem with this is that you have to take care of everything yourself, including handling timeouts if there are no responses.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文