Quitter un appel bloquant recv ()

Je veux quitter un appel bloquant recv() . Sur la base de cette question , je devrais procéder comme suit:

 shutdown(s, SD_RECEIVE); 

Mais cela ne fonctionne pas, recv() bloque toujours!


Modifier:

C’est le code que j’ai utilisé:

 #include  #include  #include  #include  #pragma comment(lib, "ws2_32.lib") unsigned int __stdcall recvThread(void *p) { SOCKET s = *((SOCKET*)p); char buffer[2048]; int size; do { size = recv(s, buffer, 2048, 0); if (size > 0) { printf("Some data received\n"); } else if (size == 0) { printf("Disconnected\n"); } else { printf("Disconnected, error occured\n"); } } while (size > 0); return 0; } int main() { // Initialize Winsock WSADATA wsa; WSAStartup(MAKEWORD(2, 2), &wsa); // Create socket SOCKET s = socket(AF_INET, SOCK_STREAM, 0); // Connect sockaddr_in addr; addr.sin_family = AF_INET; addr.sin_addr.s_addr = inet_addr("192.168.1.4"); addr.sin_port = htons(atoi("12345")); if (connect(s, (sockaddr*)&addr, sizeof(addr)) == SOCKET_ERROR) { printf("Unable to connect\n"); } else { printf("Connected\n"); } // Start recv() thread HANDLE hRecvThread = (HANDLE)_beginthreadex(0, 0, recvThread, &s, 0, 0); Sleep(3000); // Exit blocking recv() shutdown(s, SD_RECEIVE); getchar(); return 0; } 

Vous devez fermer l’entrée comme indiqué dans la question à laquelle vous avez lié. Voir la documentation de shutdown () sur msdn et ici aussi:
https://msdn.microsoft.com/en-us/library/windows/desktop/ms738547%28v=vs.85%29.aspx

Citation pertinente de la documentation:

La fonction d’arrêt est utilisée sur tous les types de sockets pour désactiver la réception, la transmission ou les deux.
Si le paramètre how est SD_RECEIVE, les appels suivants à la fonction recv sur le socket seront interdits. Cela n’a aucun effet sur les couches de protocole inférieures. Pour les sockets TCP, s’il y a toujours des données en attente sur le socket en attente de réception ou si les données arrivent ultérieurement, la connexion est réinitialisée, car les données ne peuvent pas être transmises à l’utilisateur. Pour les sockets UDP, les datagrammes entrants sont acceptés et mis en queue. En aucun cas un paquet d’erreur ICMP ne sera généré.
Si le paramètre how est SD_SEND, les appels suivants à la fonction d’envoi sont interdits. Pour les sockets TCP, une FIN sera envoyée après que toutes les données aient été envoyées et acquittées par le destinataire.
Définir comment SD_BOTH désactive les envois et les réceptions comme décrit ci-dessus.

La clé est le FIN envoyé. Ceci sera géré par le serveur et fermera le socket, ce qui entraînera le retour de votre appel recv ().