recv () a échoué: descripteur de fichier incorrect c ++ Linux

J’ai un problème. Mon programme comprend 10 serveurs TCP au même moment. Dès qu’une demande d’un client est notée, le socket du serveur TCP approprié acceptera la connexion et la gérera dans un thread séparé. Je sais que ce n’est pas le moyen le plus efficace de résoudre mon problème actuel mais ça va.

En général, j’ai une boucle for qui appellera une fonction dans un object appelé Peer qui est StartThread ()

for (it= ListOfPeers.begin();it!= ListOfPeers.end();it++) { (*it).second->StartThread(); } 

Bien sûr, cette boucle sera utilisée dans certaines conditions, mais je voulais affiner le code autant que possible.

La fonction StartThread sera appelée dans chaque object homologue:

  void StartThread() { pthread_t threadDoEvent; pthread_create( &threadDoEvent, NULL, &DoEvent_helper,this); pthread_detach(threadDoEvent); } void *DoEvent_helper( void *ptr ) // Helper to implement thread { return ((Peer *)ptr)->DoEvent(); } 

DoEvent est la fonction qui gérera la demande et la connexion:

 void* DoEvent() { unsigned char buffer[1024]; int rc; int close_conn= FALSE; int new_sd; new_sd = accept(Socket, NULL, NULL); if (new_sd < 0) { if (errno != EWOULDBLOCK) { perror(" accept() failed"); close_conn = TRUE; } } do { rc = recv(new_sd, buffer, sizeof(buffer), 0); if (rc < 0) { if (errno != EWOULDBLOCK) { perror(" recv() failed"); close_conn = TRUE; } break; } if (rc == 0) { printf(" Connection closed\n"); close_conn = TRUE; break; } [DO SOMETHING WITH THE BUFFER] rc = send(new_sd, buffer, len, 0); if (rc <= 0) { perror(" send() failed"); close_conn = TRUE; break; } }while (close_conn==FALSE); close(new_sd); } 

Ma question est pourquoi je reçois une erreur: recv () a échoué: descripteur de fichier incorrect ???? Lorsque j’ajoute un sumil (1) entre pthread_create et pthread_detach, tout fonctionne! Quelqu’un peut-il m’expliquer cette situation? ou peut-être m’aider à résoudre mon problème?

Merci!

Eh bien, vous essayez de recevoir même si accept échoue. Cela me porte à croire que vous n’avez pas correctement configuré le descripteur de fichier Socket passif avant d’essayer de l’accepter.

Si vous configurez le descripteur Socket dans le thread principal, il se peut que le nouveau thread démarre et s’exécute avant de le faire.

Assurez-vous que new_sd est dans la mémoire persistante. Par exemple, s’il est alloué par une fonction qui lance le thread et se ferme, alors new_sd pointera vers un courrier indésirable. (du moins c’était le cas pour moi)