Probleme avec un Thread créant une socket

Signaler
Messages postés
8
Date d'inscription
mercredi 5 février 2003
Statut
Membre
Dernière intervention
2 mai 2007
-
Messages postés
41
Date d'inscription
jeudi 16 juin 2005
Statut
Membre
Dernière intervention
3 mars 2006
-
Bonjour a tous ,
c'est la premiere fois que je poste sur ce forum
Donc si jamais je ne respecte pas toutes les regles n'hesitez pas a me le signaler

Voici mon probleme

j'essaye de creer en C un serveur TCP qui va recevoir 2 connexions clients simultanées

ces deux connexions doivent etre gérées independemment l'une de l'autre mais en meme temps
c'est pour cela que j'ai pensé aux threads

mon probleme est : mon application se termine car la fonction accept des threads "serveurs" n'est pas bloquante
mon programme n'arrive pas jusqu'a la fonction accept

Voici mon programme

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

// Les 2 threads crees

pthread_t num_thread_4444;
pthread_t num_thread_4445;

// Lancement des 2 threads

if(pthread_create(&num_thread_4444,NULL,multiserverthread4444,NULL)==-1){
perror("pb de creation du thread num_thread_4444");
}
printf("creation du thread 4444 reussi\n");

if(pthread_create(&num_thread_4445,NULL,multiserverthread4445,NULL)==-1){
perror("pb de creation du thread num_thread_4445");
}

printf("creation du thread 4445 reussi\n");

return(1);

}

/*------------------------------------------------------------------------------
void multiserverthread4444()
Action : Fonction protocole d'echange avec le logiciel
- Récupération des parametres de l'acquisition

Input : null
Return : 0

--------------------------------------------------------------------------------
*/

void multiserverthread4444(){

// Instanciation des parametres de nouvelle connexion apres creation du
// serveur sur le port 4444

int sock4444;
int newsock4444;
int clilen4444;
int encore = 0;

// Creation de la socket serveur sur le port 4444 servant a la reception des
//donnees

struct sockaddr_in serv_addr4444;
struct sockaddr_in cli_addr4444;

// Tentative de creation de la socket serveur sur le port 4444

if((sock4444 = socket(AF_INET,SOCK_STREAM,0)) < 0){
perror("socket4444");
exit(1);
}

else {
printf("Creation de la socket 4444 reussie \n");
}

// Les differents parametres de la connexion reseau
// Connexion sur le port 4444

memset(&serv_addr4444,0,sizeof(serv_addr4444));
serv_addr4444.sin_family = AF_INET;
serv_addr4444.sin_port = htons(PORT_SERVEUR4444);
serv_addr4444.sin_addr.s_addr = htonl(INADDR_ANY);

printf("-------------essai------------2\n");

// Bind et listen pour le serveur du port 4444

bind(sock4444,(struct sockaddr*) &serv_addr4444,sizeof(serv_addr4444));

listen(sock4444,3);

// Voir pour les connexions limitantes : il ne faut pas que la connexion
// sur le port 4444 bloque celle sur le port 4445

// accept pour le serveur (port 4444)

clilen4444 = sizeof(cli_addr4444);

// On demarre l'accept dans une autre fonction

printf("On arrive ici \n");

newsock4444 = accept(sock4444,(struct sockaddr *)&cli_addr4444,&clilen4444);

printf("newsock4444 : %d \n",newsock4444);

if (newsock4444 >= 0){

}



if(newsock4444 < 0) {
printf("Erreur lors de la creation de la socket sur le port 4444 \n");
}

if (fork() > 0){
printf("Connexion avec le logiciel sur le port 4444 \n");

// discussion4444(newsock4444);

printf ("Connexion avec le thread sur le port 4444 reussie\n");

}
}

/*------------------------------------------------------------------------------
void multiserverthread4445()
Action : Fonction protocole d'echange avec le distributeur
- Récupération des parametres de l'acquisition

Input : null
Return : 0

--------------------------------------------------------------------------------
*/

void multiserverthread4445(){

// Instanciation des parametres de nouvelle connexion apres creation du
// serveur sur le port 4445

int newsock4445;
int clilen4445;

// Creation de la socket serveur sur le port 4445 servant a la reception des
//donnees

struct sockaddr_in serv_addr4445;
struct sockaddr_in cli_addr4445;

// Tentative de creation de la socket serveur sur le port 4445

if((sock4445 = socket(AF_INET,SOCK_STREAM,0)) < 0){
perror("socket4445");
exit(1);
}

else {
printf("Creation de la socket 4445 reussie \n");
}

// Les differents parametres de la connexion reseau
// Connexion sur le port 4445

memset(&serv_addr4445,0,sizeof(serv_addr4445));
serv_addr4445.sin_family = AF_INET;
serv_addr4445.sin_port = htons(PORT_SERVEUR4445);
serv_addr4445.sin_addr.s_addr = htonl(INADDR_ANY);

// Bind et listen pour le serveur du port 4444

bind(sock4445,(struct sockaddr*) &serv_addr4445,sizeof(serv_addr4445));

listen(sock4445,3);

// accept pour le serveur (port 4445)

clilen4445 = sizeof(cli_addr4445);
newsock4445 = accept(sock4445,(struct sockaddr *)
&cli_addr4445,&clilen4445);

if(newsock4445 < 0) {
printf("Erreur lors de la creation de la socket sur le port 4445 \n");
}

if (fork() > 0){
printf("Connexion avec le logiciel sur le port 4445 \n");

// discussion4445(newsock4445);
}

}

3 réponses

Messages postés
991
Date d'inscription
samedi 25 octobre 2003
Statut
Membre
Dernière intervention
29 août 2013
7
je connai pas trop les socket en C, mais a premiere vue, je me demande pourquoi tu ne fait pas le accept() dans ton processus principal, et tu redistribue les sockets aux threads.
Messages postés
41
Date d'inscription
jeudi 16 juin 2005
Statut
Membre
Dernière intervention
3 mars 2006

dans ton process principal, tu peux éviter de quitter ton programme si tes thread ne sont pas terminé avec un while.

Pour savoir si un thread est fini, tu peux faire:

unsigned long ExitCode;

if(GetExitCodeThread(threat_handle,&ExitCode))
{
//on traite la valeur retourné par le thread
if(ExitCode==0)
{
//le thread est fini
}
else
{
//il y a eu une erreur dans le thread
}
}

dans ton thread, tu met:
ExitThread(status); //status = 0 pour ok -1 pour une erreur, ...

A++++
Messages postés
41
Date d'inscription
jeudi 16 juin 2005
Statut
Membre
Dernière intervention
3 mars 2006

ha oui, j'ai oublié,
la remarque de Guillemouze est bonne.
si tu veux ne veux pas que le accept() soit bloquant, fait des threads, mais dans ton cas, ca a pas l'air utile puisque au contraire, tu veux pas sortir de ton prog.

pour le GetExitCodeThread, fait le dans un timer par exemple

A+