begin process at 2010 02 10 11:37:31
  Trouver un code source :
 
dans
 
Accueil > Forum > 

C

 > 

Windows

 > 

Réseau & Internet

 > 

multi connexion avec thread sur socket


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

multi connexion avec thread sur socket

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ée 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

Février 2010
LMMJVSD
1234567
891011121314
15161718192021
22232425262728

Consulter la suite du CalendriCode

 
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,780 sec (3)

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