Cómo determinar si la conexión websocket está desconectada
Cuando el valor devuelto por recv() es menor o igual a 0, indica que la conexión del socket está desconectada. Pero también debe determinar si errno es igual a EINTR. Si errno == EINTR, significa que la función recv regresa después de que el programa recibe la señal, la conexión del socket aún es normal y la conexión del socket no debe cerrarse.
Método 2:
struct tcp_info info;
int len=sizeof(info);
getsockopt(sock, IPPROTO_TCP, TCP_INFO , amp;info, (socklen_t *)amp;len);
getsockopt(sock, IPPROTO_TCP, TCP_INFO, amp;info, (socklen_t *)amp;len);
Esto Está cerrando la conexión del socket por primera vez. amp; len);
if((info.tcpi_state===TCP_ESTABLISHED)) significa que la conexión no está desconectada; de lo contrario, significa que la conexión está desconectada
Método 3:
Si está utilizando una función del sistema (como seleccionar) y si el extremo remoto se desconecta, seleccionar devolverá 1 y recv devolverá 0 para desconectarse. Otras precauciones son las mismas que las del método uno.
Método 4:
int keepAlive = 1; // Habilita el atributo keepalive
int keepIdle = 60 // Si la conexión no tiene ningún dato. dentro de 60 segundos, luego realice la detección
int keepInterval = 5; // El tiempo para enviar paquetes de datos durante la detección. 5 segundos
int keepCount = 3; // Número de intentos de detección. Si se recibe una respuesta para la primera sonda, las dos sondas siguientes no se envían.
setsockopt(rs, SOL_SOCKET, SO_KEEPALIVE, (void *)amp; keepAlive, sizeof(keepAlive));
setsockopt(rs, SOL_TCP, TCP_KEEPIDLE, (void*)amp; keepIdle, sizeof(keepIdle));
setsockopt(rs, SOL_TCP, TCP_KEEPINTVL, (void *)amp; keepInterval, sizeof(keepInterval));
setsockopt(rs, SOL_TCP, TCP_KEEPCNT, (void *)&keepCount, sizeof(keepCount));
Después de la configuración, si la conexión se desconecta, el socket no se puede usar para operaciones de lectura o escritura inmediatamente y se devuelve un error ETIMEDOUT / p>
Método 5:
Implemente usted mismo la detección de latidos. Si no se recibe un paquete de latidos personalizado dentro de un cierto período de tiempo, se marcará como desconectado.