begin process at 2010 03 18 00:53:47
  Trouver un code source :
 
dans
 
Accueil > Forum > 

Archive C/C++

 > 

Archives

 > 

Au secours

 > 

Probleme avec un Thread créant une socket


Derniers messages déposésPoser une question dans le forum ou lancer une discussion

Probleme avec un Thread créant une socket

jeudi 2 mars 2006 à 11:32:00 | Probleme avec un Thread créant une socket

lapinfroid

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

vendredi 3 mars 2006 à 03:30:11 | Re : Probleme avec un Thread créant une socket

Guillemouze

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.
vendredi 3 mars 2006 à 14:18:09 | Re : Probleme avec un Thread créant une socket

CoyoteVsBeepBeep

Membre Club
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++++
vendredi 3 mars 2006 à 14:20:27 | Re : Probleme avec un Thread créant une socket

CoyoteVsBeepBeep

Membre Club
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+


Cette discussion est classée dans : port, socket, creation, thread, serv


Répondre à ce message

Sujets en rapport avec ce message

pb de socket [ par ed53 ] je voudrais que plusieurs applications qui se connecte et garde la connection sur le meme port.faut il que je crée plusieurs sockets et que je les bin Thread et socket [ par epoc ] Petite question.J'ai créé un petit serveur avec un socket 'bloquant'. Etant donné que je désire que mon aplication ne soit pas bloquée j'ai créé un th Création d'une socket .. [ par bubbless ] Bonjour !à l'aide !! J'ai programmé tout un systèle réseau / client, que j'ai enfin pu tester grâce à l'aide d'une âme charitable sur ce forum, et je Thread et socket udp [ par eurysthe ] Bonjour !!Voila j'ai un petit problème de thread qui me pourrit la vie.J'ai crée un thread qui doit écouter en boucle les informations qui transite su Creation d'un Thread en MFC et arret par un bouton [ par djtiaf ] Bonjour à tous,Je cherche à créer un Tread tout simple :fonction Thread du bouton Start{while (arret=false) { Sleep(1000) // on laisse 1 sec gestion de socket [ par kev03 ] bonjour,je travaille sur un logiciel de messagerie et j'aurais quelques petites questions a propos des sockets:peut-on laisser un grand nombre de port Ré-initialiser un programme avec socket [ par malik7934 ] socket ... tu auras ma peau!Hello! C'est moi la maxi- pine des sockets!Voici mon x'ème problème: dans mon prog, lorsque je clique sur un bouton (IDC_L Socket [ par c2millet ] Bonjour à tous,je voudrais dans un premier tps si qqun a ou connais une doc sur les sockets. Ensuite, g un petit pb. g réalisé un serveur qui lit sur connection client serveur avec MFC [ par Spiffou ] Bonjour à tous,j'avance petit à petit dans la programmation socket, mais je suis confronté à une nouvelle difficulté et j'ai une ou deux question sans Probleme thread [ par PunkDude424 ] J'ai un probleme avec les threadJ,ai un server et jessai de créer un thread a chaque fois quun client se connecte, mais sa fonctionne pas.J,ai essayer


Nos sponsors


Appels d'offres

Sondage...

Comparez les prix

CalendriCode

Mars 2010
LMMJVSD
1234567
891011121314
15161718192021
22232425262728
293031    

Consulter la suite du CalendriCode

Photothèque

 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,686 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales