Utilisation de sockets sur un serveur multithread

les mecs!

Je développe un serveur multithread sur c sous * nix. Dans le fil principal du processus, j’ai un socket d’écoute qui attend les connexions (accepter). Quand il obtient une connexion (accept renvoie le descripteur de socket client), je commence un nouveau travail avec une routine qui répond à la demande et ferme le descripteur de socket client. Cela ressemble à quelque chose comme ça:

while(1) { sock_cl =(int *)malloc(sizeof(int)); *sock_cl = accept(sock_serv, NULL, NULL); pthread_create(thread, attr, answer, sock_cl); } 

fonction de réponse:

 void *answer(void *arg) { int sock_cl; char *buf; ssize_t r; lsres_t *ans; char *path; char status[STATUS_SIZE]; sock_cl = *((int *)arg); if((buf = (char *)malloc(BUF_SIZE + 1)) == NULL) { sprintf(status, "%i\n", -1); send_data(sock_cl, status, STATUS_SIZE); close(sock_cl); free(arg); return NULL; } memset(buf, '\0', BUF_SIZE + 1); if((r = recv(sock_cl, buf, BUF_SIZE, 0)) status); send_data(sock_cl, status, STATUS_SIZE); send_data(sock_cl, ans->buf, ans->written_size); } lsdestroy(ans); } close(sock_cl); free(arg); return NULL; } 

En réponse, j’appelle recv pour recevoir les données du client et envoyer une réponse. Cela fonctionne très bien sous les systèmes Linux (Arch, Debian, Ubuntu), mais lorsque je tente de l’exécuter sous Unix (Solaris), j’obtiens une chute de segmentation dans recv. Le problème n’est pas dans la mémoire tampon, car si j’essaie d’appeler la fonction de réponse dans le même fil que la fonction de réponse, je n’ai aucune chute de segmentation. Il y a donc un problème avec l’utilisation de sockets avec pthreads.

S’il vous plaît, conseillez-moi n’importe quelle solution sur la façon d’utiliser les sockets dans un serveur multithread. Merci pour les réponses futures!

Sous Solaris, vous devez généralement comstackr avec -mt pour comstackr et lier correctement un programme multithread. Si vous ne l’utilisez pas, vous aurez des plantages aléatoires dans les discussions comme vous le voyez.

Je pense que dans la recun unix la fonction échoue et que la segmentation est due au segment de code free(args);

Peut-être cela pourrait être la raison

  close(sock_cl); free(arg); return NULL; 

Sock_cl est partagé entre les threads et, comme il n’y a pas de synchronisation pour la fonction de réponse et que vous libérez ce pointeur, les autres threads sur le sharepoint tomber en panne, vous pouvez si possible archiver ce même programme en exécutant valgrind.