Cómo determinar si websocket está desconectado
Cuando el valor de retorno de recv() es menor o igual a 0, la conexión del socket se desconecta. Pero aún queda por determinar si errno es igual a EINTR. Si errno == EINTR, significa que el programa vuelve a la función de recepción después de recibir 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 e información, (socklen _ t *) & len);
if ((info . tcpi _ state == TCP _ establecido)) significa que no está desconectado.
Método tres:
Si usa select y otras funciones del sistema, si el extremo remoto está desconectado, select devuelve 1 y recv devuelve 0 para desconectarse. Otras precauciones son las mismas que las del método 1.
Método 4:
int keepAlive = 1; //Abre el atributo keepalive.
int keepIdle = 60 //Si la conexión no intercambia datos dentro de 60 segundos, detectarlo.
int keep intervalo = 5; //El intervalo de salida durante la detección es de 5 segundos.
int keep count = 3; //El número de intentos de detección. Si el primer paquete de sonda recibe una respuesta, el segundo paquete de sonda no se enviará.
setsockopt(rs, SOL_SOCKET, SO_KEEPALIVE, (void *)& & keepAlive, sizeof(keepAlive));
setsockopt(rs, SOL_TCP, TCP_KEEPIDLE, (void *)& amp ; keepIdle, sizeof(mantener inactivo));
setsockopt(rs, SOL_TCP, TCP_KEEPINTVL, (void *)& amp; keepInterval, sizeof(mantener intervalo)); rs, SOL_TCP, TCP_KEEPCNT, (void *) & keepCount, sizeof(keep count));
Después de la configuración, si se desconecta la conexión, la lectura y escritura con el socket fallará inmediatamente y devolverá el error ETIMEDOUT.
Método 5:
Implemente usted mismo una 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.