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);
}
}