Cómo forzar al sistema a cerrar el socket subyacente
Cuando utilizamos IOCP (puerto de finalización) para programar, muchas veces tenemos que cerrar algunos sockets que no cumplen las condiciones. Si utilizamos directamente el método closesocket para cerrar, los datos no enviados de este socket vinculado al puerto IO se perderán. Esta situación es algo que no queremos que suceda. A continuación se presenta un método razonable para cerrar este socket:
Primero, use la función setsockopt (MSDN) para configurar las opciones del socket. Configuramos el socket en: Si hay datos que no se han enviado. y luego cierre el socket después de enviar los datos.
Pasos/Métodos
1
El código es el siguiente:
LINGER lingerStruct;
lingerStruct. l_onoff = 1 ;
lingerStruct.l_linger = 0;
setsockopt(Socket, SOL_SOCKET, SO_LINGER,
(char *)&lingerStruct, sizeof(lingerStruct) ) ;
p>//
2
// Ahora cierre el identificador del socket. Esto realizará un cierre abortivo o elegante, según lo solicitado.
CancelarIo ((HANDLE) Socket);
closesocket(Socket);
clientSocket = INVALID_SOCKET;
3
Al completar el puerto Después de enviar los datos, el socket se cerrará, por lo que hemos completado el cierre de un socket.