Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum. Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

Sujet : multi connexion avec thread sur socket [ Windows / Réseau & Internet ] (goldziko9)

mardi 21 août 2007 à 09:40:17 | multi connexion avec thread sur socket

goldziko9

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 <pthread.h>
#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 !! ?


jeudi 23 août 2007 à 02:08:10 | Re : multi connexion avec thread sur socket

max12

Administrateur CodeS-SourceS
Réponse acceptée !
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+



Cette discussion est classé dans : socket, char, sin, ssock, infosys


Répondre à ce message

Sujets en rapport avec ce message

mail - socket - pk sa déconne ?!? [ par Gendal67 ] Bonsoir,Alors la, jvous en prie aidez moi avant que je ne prenne mon clavier, ma souris, mon modem et tout le reste et que je les cognent du +fort que utilisation basique de winsock [ par Spiffou ] bonjour à tousj'essaie d'apprendre winsock en vc++ mode console pour le moment, et j'ai qlq difficultés...en gros j'etabli bien une connection entre l pb de compilation (prog utilisant un socket) [ par smook ] boujour a tous bon je vais commencer part bien vous detailler ce qui a detailler : j utilise dev c++ 4.9.9.2 et mon ^programme a pour but d ecouter un Probléme pour lire le buffer au lancement de la connexion [ par logant83 ] Bonsoir, voila enfaite j'ai établi une connexion sur un server irc grace au socket mais quand je recois sur le buffer les différente informations (Ell sockets [ par deck_bsd ] Bonjour a tous, Voila je me suis mis récement au socket et j'ai coder un client et un serveur. Tout bête le client envoie un message ( "hello you" ) Scanner un réseau local : durée du RTT [ par YURIX ] Je suis en train de programmer en C++ un scanner pour mon réseau local.J'ai donc créer un socket de cette manière :WSADATA WSAData;WSAStartup(MAKEWORD buggage [ par logant83 ] Bonjour, voila enfaite je suis sous devc++ et je code un service irc et je sais pas ce qui se passe, de temp en temp window m'envoy une erreur comme k Socket et dev c++ [ par CCJ ] Bonjour. JE tente de creer un programme de dialogue par socket en c++ via dev c++ et dés le debut je rencontre un probleme , des references semblent m fonction accepte bloquante.. [ par ssmint ] Bonjour à tous,nouveau problème de socket, côté server cette fois ci :imaginons que plusieurs clients cherchent à se connecter sur le port d'écoute du probleme de serveur multi-client [ par Mick7 ] je m'explique je suis arrivé a creer un serveur qui peut accepter 2 client mais le probleme est que si j'essaye de creer les 2 sockets sur le meme por


Nos sponsors

Sondage...

CalendriCode

Juillet 2009
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
2728293031  

Consulter la suite du CalendriCode

Téléchargements

Logiciels à télécharger sur le même thème :

Comparez les prix Nouvelle version


LG KP501

Entre 9€ et 159€


Photothèque Nouveau !



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
Temps d'éxécution de la page : 0,889 sec

Google Coop CodeS-SourceS Google Coop CodeS-SourceS


Certaines images présentes sur le site (notament certains avatars) sont issues des collections IconShock, donc si vous souhaitez utiliser ces icons vous devez les acheter, ne les copiez pas et ne utilisez pas dans vos sites et applications sans les avoir commandé.