c++ sockets winapi network-programming winsock

c++ - ¿Cómo salir de una llamada de bloqueo recv()?



sockets winapi (2)

Esta pregunta ya tiene una respuesta aquí:

En base a esta question , cuando llama a closesocket() en un socket que ya está utilizando recv() , se enviará un paquete RST al otro lado en lugar de realizar una desconexión elegante (apretón de manos de 4 vías).

Pero deseo realizar una desconexión elegante, por lo que necesito salir de recv() antes de llamar a closesocket() .

¿Hay una manera de hacerlo?


El verdadero problema aquí es que un kill seguro, terminatethread (), tiene todo tipo de advertencias sobre los malos efectos de su uso. He estado usando este método para salir de un recv (). Los documentos de Windows dicen "debes saber qué está haciendo el hilo antes de aplicar terminatethread", bueno, sabemos lo que está haciendo, está en recv (). La pregunta no es qué está haciendo THREAD, es qué está haciendo el kernel de Windows.

En el sistema embebido RTOSes he hecho killthread () es factible. No es FÁCIL, debe encontrar todos los bloqueos y recursos que posee el subproceso y retrocederlo. Solo el sistema operativo tiene ese tipo de información (y poder).


Puede shutdown() el zócalo para la entrada. El recv() desbloqueará y devolverá cero y todos estarán felices.