Tengo una aplicación C++ que usa llamadas de socket estándar y quiero saber si puedo saber si un socket sigue abierto sin enviar ni recibir datos. ¿Hay una llamada confiable select
o ioctlsocket
que pueda hacer?¿Cómo puedo verificar si todavía hay un socket abierto?
Respuesta
Si intenta recibir un byte, puede recibir varios errores, si tuviera un socket no bloqueante y tratara de recibir una conexión válida, obtendrá el error WSAEWOULDBLOCK.
Sabiendo esto podemos comprobar una toma no bloqueante al igual que
bool connected(SOCKET sock)
{
char buf;
int err = recv(sock, &buf, 1, MSG_PEEK);
if(err == SOCKET_ERROR)
{
if(WSAGetLastError() != WSAEWOULDBLOCK)
{return false;}
}
return true;
}
como se puede ver en la return value of recv recv puede devolver un tiempo de espera o varios otros errores de desconexión, i belive WSAEWOULDBLOCK es el único valor que puede devuelva si hubo un error pero aún está conectado, pero es posible que desee verificar dos veces esa lista de valores devueltos. Además, el indicador utilizado en recv (MSG_PEEK) significa que los datos aún se pueden leer cuando va a mirar más tarde después de la verificación, por lo que no tiene que preocuparse por perder un byte de datos.
Creo que esto solo funcionará bien con enchufes sin bloqueo, ya que puede bloquear hasta que reciba datos. Si desea utilizar el socket de bloqueo, puede configurarlo sin bloqueos con ioctlsocket antes de esta comprobación, luego devolverlo a cómo estaba.
Para los enchufes de bloqueo que usaría seleccione. –
Un socket "abierto" no lo ayuda con la conectividad de extremo a extremo. La única manera de saber con certeza que puede comunicarse con el otro extremo es, bueno, comunicarse con el otro extremo.
En cualquier protocolo que diseñe, debe pensar en implementar este comportamiento de comprobación. Si no es su protocolo, a veces hay maneras de hacerlo a escondidas (por ejemplo, FTP hasta un archivo muy pequeño e inútil para verificar si los puertos FTP aún están abiertos).
- 1. ¿Cómo verificar si el socket todavía está conectado?
- 2. ¿Cómo puedo verificar si un filehandle está abierto en Perl?
- 3. Verificar si datepicker está abierto
- 4. Ruby: compruebe si hay un puerto abierto
- 5. ¿Cómo saber si el socket está abierto en PHP?
- 6. compruebe si hay un socket de servidor abierto en el otro lado
- 7. ¿Cómo puedo verificar si un socket está actualmente conectado en Java?
- 8. ¿Cómo verificar si un socket está conectado/desconectado en C#?
- 9. ¿Cómo determinar si un archivo abierto es un socket o un conducto?
- 10. ¿Cómo puedo verificar si existe un directorio?
- 11. ¿cómo puedo verificar si existe un archivo?
- 12. ¿Cómo cerrar un socket dejado abierto por un programa destruido?
- 13. Cómo comprobar si un elemento seleccionado todavía está "abierto"/activo con jquery
- 14. ¿Cómo verificar si stdin aún está abierto sin bloqueo?
- 15. ¿Cómo puedo verificar si una IP está viva en Java?
- 16. ¿Cómo puedo verificar si un valor es un número?
- 17. ¿Puedo verificar si hay HTTPS en los archivos Magento PHTML?
- 18. ¿Cómo puedo verificar si existe un procedimiento en un paquete?
- 19. ¿Cómo puedo verificar si hay un registro en mi colección que coincida con un criterio?
- 20. java: ArrayList: ¿cómo puedo verificar si existe un índice?
- 21. Rieles: ¿Cómo puedo verificar si una columna tiene un valor?
- 22. ¿Cómo puedo verificar si un complemento jQuery está cargado?
- 23. ¿Cómo puedo verificar si un módulo Perl está instalado?
- 24. ¿Cómo puedo verificar si un JSON está vacío en NodeJS?
- 25. ¿Cómo puedo verificar si un atributo existe en XmlAttributeCollection?
- 26. ¿Cómo puedo verificar si un identificador de MATLAB es válido?
- 27. ¿Cómo puedo verificar si se lanza un objeto?
- 28. JS ¿Hay alguna manera de verificar si existe un evento?
- 29. ¿Cómo puedo verificar si hay un proceso en ejecución por sesión de usuario?
- 30. ¿Cómo puedo verificar cuántas opciones hay en un menú desplegable?
¿Quiere decir comprobar si la toma se ha cerrado en el otro extremo? –
Sí. Mi aplicación se ejecuta en Windows y si la computadora está hibernada, cuando vuelve el socket puede que ya no sea válido ya que el otro extremo lo ha cerrado (y como mi aplicación se suspende, no recibo ninguna notificación). – Rob