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 -
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
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:
- Prb avec les thread en c
- Compte thread - Accueil - Réseaux sociaux
- Thread instagram c'est quoi - Accueil - Guide réseaux sociaux
- Fausse appli Threads : déjà une imitation frelatée et dangereuse ! - Accueil - Guide arnaque
- C quoi thread - Guide
- Thread instagram - Guide
3 réponses
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.
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.
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
donc je t'ai pas bien compris
merci encore
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.
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.