Multi connexion avec thread sur socket

[Résolu]
Signaler
Messages postés
39
Date d'inscription
lundi 3 janvier 2005
Statut
Membre
Dernière intervention
5 avril 2010
-
Messages postés
1491
Date d'inscription
dimanche 19 novembre 2000
Statut
Modérateur
Dernière intervention
7 juillet 2014
-
Salut tous le monde.
   voilà je suis debutant dans le language C, j'ai fait un serveur avec C# et je veux le refaire dans C, j'ai etudie les socket, jusque arrivé a ce code :

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <win\winsock2.h>
#pragma comment(lib, "ws2_32.lib")
#include
#pragma comment(lib, "pthreadVC2.lib")
//>------------------------------------------------------------------------>
struct repp
{
 char *nom;
 char *ip;
 char *OSver;
};
struct repp infosys;
unsigned int s_( char* str,  char* cmp[])
{
 unsigned int i = 0; 
 while (cmp[i] != 0)
  {
  if (strcmp(str, cmp[i]) == 0)
   return i+1;
   i++;  
  }
 return 0;
}
static void *dailog(void *sock)
{
 infosys.OSver = (char*)"version OLD";
 infosys.ip = (char*)"100.111.122.133";
 infosys.nom = (char*)"my name is";
 SOCKET ssock = (unsigned int)sock;
 if (ssock ==  INVALID_SOCKET)
 {
  printf("socket non valide\n\a");
 }
 char buffer[255];
 char* comp[] = {"i_nom", "i_ver", "i_ip", "i_date", "b", "",0};
 while (1)
 {
  recv(ssock,buffer,sizeof(buffer)-1,0);
  unsigned int id = s_((char*)buffer, comp);
  switch(id)
  {
   case 1:
    send(ssock,infosys.nom,strlen(infosys.nom),0);
    break;
   case 2:
    send(ssock,infosys.OSver,strlen(infosys.OSver),0);
    break;
   case 3:
    send(ssock,infosys.ip,strlen(infosys.ip),0);
    break;
   case 4:
    send(ssock,"date",5,0);
    break;
   case 5:
    send(ssock,"bye",4,0);
    shutdown (ssock, 2);
    closesocket(ssock);
    return 0;
    break;
   case 6:
    send(ssock,"#",4,0);
    break;
   default:
    break;
  }
 }
 free(&infosys);
 free(&ssock);
 free(&buffer);
 return 0;
}
int main(void)
{
 WSADATA WSAData;
 WSAStartup(MAKEWORD(2,0), &WSAData);
 SOCKET sock;
 SOCKET csock;
 SOCKADDR_IN sin;
 SOCKADDR_IN csin;
 sock = socket(AF_INET, SOCK_STREAM, 0);
 sin.sin_addr.s_addr = INADDR_ANY;
 sin.sin_family = AF_INET;
 sin.sin_port = htons(23);
 pthread_t ta;
 bind(sock, (SOCKADDR *)&sin, sizeof(sin));
 listen(sock, 4);
 printf("serveur lancer en ecoute sur le port %d avec l'ip %s \n\a",htons(sin.sin_port),inet_ntoa(sin.sin_addr));
 while(1)
 {
  int sinsize = sizeof(csin);
  if((csock = accept(sock, (SOCKADDR *)&csin, &sinsize)) != INVALID_SOCKET)
  {
   send(csock, "Hello world!\r\n", 14, 0);
   //dailog(csock);
   if (pthread_create (&ta, NULL, dailog,(unsigned int*)csock)==0)
   {
    printf("client sur port %d avec l'ip %s\n\a",htons(csin.sin_port),inet_ntoa(csin.sin_addr));
   }
   else
   {
    printf("erreur pour l'ip %s .",inet_ntoa(csin.sin_addr));
   }
     pthread_join (ta, NULL);
   //printf("client a l'ip %s sur le port %d n'est plus la !!\n\a",inet_ntoa(csin.sin_addr),htons(csin.sin_port));
  }
 }
 free(&csin);
 free(&sin);
 free(&sock);
 free(&csock);
 free(&ta);
 printf("terminer !!\a\a\a");
 system("pause");
 return 0;
}

le principe et simple, et je veux que plusieur connexion au meme serveur soit possible.
j'ai fais les pthread, mais je ne sais pas pourquoi ça ne marche pas, une connexion et possible mais sans reponse de serveur au requete de client.

ps : le client et en C#, je croix que c'est pas un problem !! ?

1 réponse

Messages postés
1491
Date d'inscription
dimanche 19 novembre 2000
Statut
Modérateur
Dernière intervention
7 juillet 2014

J'ai déjà utilisé PThread mais sa fait un bout, si je me souviens bien en faisant : pthread_join (ta, NULL); ton code va rester bloqué jusqu'a ce que le thread soit détruit alors dans tel cas c'est normal qu'une seule connexion soit possible, il faut ajouter pthread_attr_setdetachstate (&thread_attr, PTHREAD_CREATE_DETACHED) //Documente toi bien a ce propos car je suis rouillé.

. À moins que tu tiennes a faire ton serveur multi-plateforme à tout prix tu peux laisser tomber les pthread et utiliser directement les API win32 avec les sémaphore, critical section, event, mutex pour synchroniser.

À ce sujet un de mes vieux codes : http://www.cppfrance.com/codes/SERVEUR-MULTITHREAD-SOUS-LINUX-WINDOWS-MYSQL-VCPLUSPLUS-DEVCPLUSPLUS_40044.aspx

C'est à peu près exactement ce que tu veux faire, et pour le client fait le comme tu veux sa n'aura pas la moindre influence :)

A+