我正在用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服务器端口)。如果有一个服务器在该IP的554端口上监听,一切都很顺利,但是:
- 如果我的过滤器创建了一个套接字到一个现有的IP地址,但是在没有人侦听的随机端口上,
connect()
等待3秒并返回WSAETIMEDOUT
。因此,在3秒后,我知道提供的URL是错误的。 - 如果我的过滤器创建了一个套接字到一个不存在的IP地址,并尝试连接它,在返回SOCKET_ERROR之前会挂起约10秒。因此,如果IP在网络上不存在,则
SO_RCVTIMEO
将被忽略...
任何帮助将不胜感激。 谢谢。 :) 我的问题的答案 因为我正在使用阻塞套接字,所以调用
connect()
会被阻塞,直到连接成功或连接失败,因为主机没有响应或者拒绝连接。如果我将套接字的超时设置为3秒,并尝试连接一个不存在的主机,我的电脑(客户端)将发送TCP数据包并设置SYN
标志,以启动三次握手。通常情况下,如果主机正常,它会回复一个包含ACK
和SYN
标志的TCP数据包,然后客户端(我)会发送一个设置了ACK
标志的TCP数据包。然后连接就建立了。但是,如果主机已经关闭,并且发送了SYN
,客户端会等待3秒超时时间到期,然后重试,再重试,直到达到了MICROSOFT ARTICLE中设置的TcpMaxConnectRetransmissions
注册表设置,因为主机可能是正常的,但SYN
数据包可能会丢失...我的Windows XP设置为4,每次尝试发送SYN
时,它会等待3秒,当第四次尝试失败时,在12秒后返回SOCKET_ERROR
,并设置WSAETIMEDOUT
作为最后的WSA错误。解决这个问题的方法是使用非阻塞套接字,并尝试手动测量连接尝试时间(因为现在
connect()
不会被阻塞),就像Martin James建议的那样。
另一种方法是调整注册表,这是最后的手段...