Estoy desarrollando un filtro de fuente RTSP en C++, y estoy usando WINSOCK 2.0 - socket de bloqueo.WINSOCK: ¿configura un tiempo de espera para un intento de conexión en una IP no existente?
Cuando se crea un socket de bloqueo, que establezca su SO_RCVTIMEO
a 3 segundos, así:
int ReceiveTimeout = 3000;
int e = setsockopt(Socket, SOL_SOCKET, SO_RCVTIMEO, (char*)&ReceiveTimeout, sizeof(int));
Mi filtro intenta conectarse a IP_ADDRESS:554
(554 es el puerto del servidor RTSP). Si hay un servidor escuchando en ese IP en el puerto 554, todo va bien, pero:
Si mi filtro crea un socket a una dirección IP existente , pero en un puerto aleatorio que nadie escucha en,
connect()
espera 3 segundos y devuelveWSAETIMEDOUT
. Entonces, después de 3 segundos, sé que la URL proporcionada es mala.Si mi filtro crea un socket a dirección IP no existente, e intenta conectarlo, se bloquea durante aproximadamente 10 segundos antes de devolver SOCKET_ERROR. Así,
SO_RCVTIMEO
se tendrá en cuenta si el IP no existe en la red ...
PREGUNTA: ¿Cómo puedo configurar el tiempo de espera para una IP no existente, en el segundo caso? ¿Debo enviar ICMP PING primero para ver si existe la IP, o realizar alguna otra comprobación como esa?
Cualquier ayuda será apreciada. Gracias. :)
la respuesta a mi problema
porque estoy utilizando sockets de bloqueo, llame a connect()
bloques, hasta que se establezca la conexión, o la conexión falla porque el host no responde o se niega conexión. Si establezco el tiempo de espera del socket en 3 segundos y trato de conectarme a un host que no existe, mi pc (cliente) enviará un paquete TCP con el indicador SYN
establecido para iniciar el Handshake de tres vías. Normalmente, el host, si está activo, responderá con un paquete TCP que contenga los flags ACK
y SYN
, y luego, el cliente (me) enviará el paquete TCP con el indicador ACK
establecido. Entonces la conexión está hecha. PERO si el host está inactivo y se envía el SYN
, el cliente espera hasta que expire el tiempo de espera de 3 segundos y vuelve a intentar OTRA VEZ, hasta que se alcance la configuración de registro TcpMaxConnectRetransmissions
(MICROSOFT ARTICLE), porque el host puede estar ARRIBA pero el SYN
el paquete puede perderse ... Mi Windows XP tiene esta configuración en 4, supongo, así que cada vez que intenta enviar SYN
, espera 3 segundos, y cuando la cuarta prueba falla, devuelve SOCKET_ERROR
(después de 12 segundos), y establece WSAETIMEDOUT
como el último error de WSA.
La forma de evitar esto es usar sockets que no sean de bloqueo e intentar medir manualmente el tiempo de intento de conexión (porque ahora el connect()
no se bloquea) como sugirió Martin James.
Otra forma es que jugar con el registro, que es el último recurso ...
¿Es esto en una ventana o una aplicación de consola? La pregunta es importante porque me permite saber qué herramientas en el wsapi tienes disponibles para ti. – johnathon
Es un filtro DirectShow Push Source, biblioteca DLL. – Cipi