Multi connexion avec thread sur socket

Résolu
goldziko9 Messages postés 39 Date d'inscription lundi 3 janvier 2005 Statut Membre Dernière intervention 5 avril 2010 - 21 août 2007 à 09:40
cs_max12 Messages postés 1491 Date d'inscription dimanche 19 novembre 2000 Statut Modérateur Dernière intervention 7 juillet 2014 - 23 août 2007 à 02:08
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

cs_max12 Messages postés 1491 Date d'inscription dimanche 19 novembre 2000 Statut Modérateur Dernière intervention 7 juillet 2014
23 août 2007 à 02:08
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+
3
Rejoignez-nous