Prb avec les thread en c

yuri648 Messages postés 677 Date d'inscription   Statut Membre Dernière intervention   -  
Char Snipeur Messages postés 9813 Date d'inscription   Statut Contributeur Dernière intervention   -
Bonjour,

j'ai un petit probleme avec les thread en c j'ai un fichier serveur qui accepte les connections client, achaque connection le programme lui alloue un processus.
si un seul client se connect pas de probleme et si 2 client connecte au meme temps ya un probleme, je crois qu'ils accede a la meme variable ou je ne sais pas quoi
voisi a bout de mon programme serveur:

#include "messgH.h"
#include "entet.h"
#include<stdio.h>
#include<stdlib.h>
#include<pthread.h>

#include "pvm3.h" /* pvm3 header file */
#include <stdio.h>

#include <string.h>
#include <time.h>
#define BACKLOG (100) // Max. request backlog

struct Namespace *namespaces;

int main(int argc, char **argv)
{

struct soap v_soap;
soap_init(&v_soap);
soap_set_namespaces( &v_soap, messg_namespaces );
v_soap.send_timeout = 3660; // 3660 seconds
v_soap.recv_timeout = 3660; // 3660 seconds
v_soap.accept_timeout = 3600; // server stops after 1 hour of inactivity
v_soap.max_keep_alive = 100; // max keep-alive sequence
void *process_request(void*);
struct soap *tsoap;
pthread_t tid;
int port = 8060; // first command-line arg is port
SOAP_SOCKET m, s;
m = soap_bind(&v_soap, NULL, port, BACKLOG);
if (!soap_valid_socket(m))
exit(1);
fprintf(stderr, "Socket connection successful %d\n", m);
for (;;)
{
s = soap_accept(&v_soap);
if (!soap_valid_socket(s))
{
if (v_soap.errnum)
{
soap_print_fault(&v_soap, stderr);
exit(1);
}
fprintf(stderr, "server timed out\n");
break;
}
fprintf(stderr, "Thread * accepts socket %d connection from IP %d.%d.%d.%d\n", s, (v_soap.ip >> 24)&0xFF, (v_soap.ip >> 16)&0xFF, (v_soap.ip >> 8)&0xFF, v_soap.ip&0xFF);
tsoap = soap_copy(&v_soap); // make a safe copy
// process_request ((void*)tsoap);
if (!tsoap)
break;
pthread_create(&tid, NULL, process_request, tsoap);
}

soap_done(&v_soap); // detach soap struct
return 0;
}
void *process_request(void *soap)
{

pthread_detach(pthread_self());

messg_serve((struct soap*)soap);
printf("Socket connec;,:tion successful \n");
soap_destroy((struct soap*)soap); // dealloc C++ data
soap_end((struct soap*)soap); // dealloc data and clean up
soap_done((struct soap*)soap); // detach soap struct
free(soap);
return NULL;
}



je recois cette erreur au niveau du serveur:



[1]+ Segmentation fault ./serveur
</gras>

merci d'avance
A voir également:

3 réponses

yuri648 Messages postés 677 Date d'inscription   Statut Membre Dernière intervention   7
 
je suis vraiment coincé sa fait une semaine !!!!
0
Char Snipeur Messages postés 9813 Date d'inscription   Statut Contributeur Dernière intervention   1 299
 
Salut.
Le code est incomplet et n'est pas indenté (utilises les balises de code), il faut vraiment le vouloir pour le lire.
Je ne peux pas te donner de réponse sur, car je ne connais pas soap. C'est standard ?
Dans mon programme utilisant pthread et socket, j'ai une différence avec toi : je crée mon thread directement à l'état détacher (en fait joignable) et je lui fourni des attributs.
Est-ce que tu as le socket dans v_soap ? si c'est similaire aux socket standard (accept) : non, et c'est peut être ça qui pose problème.
0
yuri648 Messages postés 677 Date d'inscription   Statut Membre Dernière intervention   7
 
merci de m'avoir repondu , meme moi je ne connais pas bien soap, c pas mon objectif dans mon projet ,mais je suis obligé de l'utiliser
donc je t'ai pas bien compris

merci encore
0
Char Snipeur Messages postés 9813 Date d'inscription   Statut Contributeur Dernière intervention   1 299
 
Si tu as une erreur de segmentation au deuxième client, c'est qu'il y a un problème de données. Je doute que ça vienne des thread (mais sait on jamais).
J'ai regardé à nouveau ton programme, et il y a peut être quelque chose.
ça viens peut être sur soap_copy (je ne sais pas ce que ça fait) Plutôt que de le mettre dans le main, je déplacerai cette copie dans process_request, en première instruction. En modifiant cette fonction pour avoir tsoap en variable locale.
0