Cómo saber si un enchufe ha sido desconectado
Después de conectar el socket, si el cliente sale de manera anormal, como por desconexión del cable de red, tiempo de espera de salida, etc., el servidor todavía tiene un caché para el socket. En este momento, se pueden leer algunos datos del descriptor del socket por un corto tiempo. Incluso se puede escribir durante un período de tiempo, por lo que no es fácil juzgar si el socket TCP está desconectado. Hay muchos métodos en Internet y es imposible juzgar con precisión. Escribí uno usando select() y recv, lo cual es muy útil para juzgar después de leer el búfer. Aquí, cuando recv usa el parámetro MSG_PEEK, los datos no se borrarán del búfer, por lo que la lectura y escritura normales no se verán afectadas.
/* Compruebe si el enchufe está conectado. En la práctica, esto no es exacto si el cliente
* falla y el servidor no lo sabe porque el búfer del socket ya está listo.
* Por lo tanto, un valor de retorno de "0" no significa que el socket sea realmente válido. Por supuesto,
* '-1' significa que el socket no es válido */int checkock(int s){fd_set fds;
char buf[2];
int nbread;
FD_ZERO(&fds);
FD_SET(s,&fds);
if ( select() (s+1, &fds , (fd_set *)0, (fd_set *)0, NULL) == -1 ) {
//log(LOG_ERR, "select()():%s\n",strerror( errno )) ;return -1;}if (!FD_ISSET(s,& fds)) {
//log(LOG_ERR, "select() devuelve OK pero FD_ISSET no\n"); return -1;}/* Leer un byte del socket*/