gpt4 book ai didi

c++ - WINSOCK - 为不存在的 IP 上的连接尝试设置超时?

转载 作者:IT老高 更新时间:2023-10-28 22:15:20 27 4
gpt4 key购买 nike

我正在用 C++ 开发一个 RTSP 源过滤器,并且我正在使用 WINSOCK 2.0 - 阻塞套接字。

当我创建一个阻塞套接字时,我将其 SO_RCVTIMEO 设置为 3 秒,如下所示:

int ReceiveTimeout = 3000; 
int e = setsockopt(Socket, SOL_SOCKET, SO_RCVTIMEO, (char*)&ReceiveTimeout, sizeof(int));

我的过滤器尝试连接到 IP_ADDRESS:554(554 是 RTSP 服务器端口)。如果有服务器在 554 端口上监听该 IP,则一切正常,但是:

  1. 如果我的过滤器创建了一个到 现有 IP 地址的套接字,但在没有人监听的随机端口上,connect() 等待 3 秒并返回 WSAETIMEDOUT。所以 3 秒后,我知道提供的 URL 是错误的。

  2. 如果我的过滤器创建一个到不存在的 IP 地址 的套接字并尝试连接它,它会挂起大约 10 秒,然后返回 SOCKET_ERROR。因此,如果网络上不存在 IP,SO_RCVTIMEO 将被忽略...

问题:在第二种情况下,如何为不存在的 IP 设置超时?我是否需要先发送 ICMP PING 以查看 IP 是否存在,或者执行其他类似的检查?

任何帮助将不胜感激。谢谢。 :)

我的问题的答案

因为我正在使用阻塞套接字,所以调用 connect() 阻塞,直到建立连接,或者连接失败,因为主机没有响应,或者它拒绝连接。如果我将套接字的超时设置为 3 秒,并尝试连接到不存在的主机,我的电脑(客户端)将发送设置了 SYN 标志的 TCP 数据包,以启动 三次握手。通常情况下,如果主机启动,将响应包含 ACKSYN 标志设置的 TCP 数据包,然后客户端(我)将发送带有 的 TCP 数据包ACK 标志设置。然后建立连接。但是如果主机关闭,并且发送了 SYN,客户端会等待直到 3 秒超时到期,然后再次尝试,直到 TcpMaxConnectRetransmissions (MICROSOFT ARTICLE)已达到注册表设置,因为主机可以启动,但 SYN 数据包可能会丢失...我的 Windows XP 的此设置为 4,我猜,所以每次它尝试发送 SYN,它等待 3 秒,当第四次尝试失败时,它返回 SOCKET_ERROR(12 秒后),并将 WSAETIMEDOUT 设置为最后一个 WSA 错误。

解决这个问题的方法是使用非阻塞套接字,并按照 Martin James 的建议尝试手动测量连接尝试时间(因为现在 connect() 不会阻塞)。

另一种方法是摆弄注册表,这是最后的手段......

最佳答案

咬紧牙关。远程 IP 可能没有运行 PING 服务器,或者 PING 可能被某些路由器阻止,因此没有任何帮助。你能不能只等待 10 秒,然后做出你使用的任何错误指示?

如果您绝对必须在 3 秒后超时尝试连接,您可以自己超时。

关于c++ - WINSOCK - 为不存在的 IP 上的连接尝试设置超时?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6199122/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com