我正在开发C++中的RTSP源代码过滤器,并且使用WINSOCK 2.0 - 阻塞套接字。WINSOCK - 在不存在的IP上设置连接尝试超时?
当我创建一个阻塞套接字,我设置其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,一切顺利,但是:
如果我的过滤器创建一个套接字到现有IP地址,但一个随机端口上没人听
connect()
等待3秒钟并返回WSAETIMEDOUT
。所以3秒后,我知道提供的URL是不好的。如果我的过滤器创建一个套接字到不存在的IP地址,并尝试连接,它返回SOCKET_ERROR前挂机约10秒。因此,如果IP不存在网络上
SO_RCVTIMEO
被忽略......
问题: 如何设置超时为不存在的IP,在第二种情况下?我是否需要首先发送ICMP PING来查看IP是否存在,或者执行其他类似的检查?
任何帮助将不胜感激。 Thanx。 :)
我的问题的答案
因为我使用的是阻塞插座,来电connect()
块,直到建立连接,或者因为主机没有响应连接失败,或者被拒绝连接。如果我将套接字的超时设置为3秒,并尝试连接到一个不存在的主机,我的电脑(客户端)将发送带有SYN
标志的TCP数据包,启动三通握手。通常情况下,主机如果启用,将使用包含ACK
和SYN
标志集的TCP数据包进行响应,然后客户机(我)将发送标记为ACK
的TCP数据包。然后建立连接。但是如果主机关闭,并且发送了SYN
,则客户端会等到3秒超时过期,然后再次尝试重新尝试,直到达到TcpMaxConnectRetransmissions
(MICROSOFT ARTICLE)注册表设置为止,因为主机可以处于UP状态,但是SYN
数据包可能会丢失...我的Windows XP的设置为4,我猜,所以每次尝试发送SYN
时,它会等待3秒,当第四次尝试失败时,它会返回SOCKET_ERROR
(12秒后),并且将WSAETIMEDOUT
设置为最后一次WSA错误。
解决方法是使用非阻塞套接字,并尝试手动测量连接尝试时间(因为现在connect()
不会像Martin James所建议的那样)。
另一种方法是使用注册表,这是不得已而为之拨弄......
这是在Windows或控制台应用程序?这个问题很重要,因为它让我知道你可以使用的wsapi中的哪些工具。 – johnathon 2011-06-01 12:23:47
它是一个DirectShow推送源过滤器,DLL库。 – Cipi 2011-06-01 12:29:28