IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Réseau C Discussion :

[Socket] Serveur gérant un dialogue entre plusieurs clients


Sujet :

Réseau C

  1. #1
    Membre actif Avatar de sorry60
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    802
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 802
    Points : 253
    Points
    253
    Par défaut [Socket] Serveur gérant un dialogue entre plusieurs clients
    Bonjour à tous,

    Je souhaite réaliser une appli un petit plus compliquée que ce que j'ai fait jusqu'à présent avec les sockets.
    Un serveur gère le dialogue entre plusieurs clients (un little messenger maison ).
    En gros :
    un client se connecte au serveur en lui envoyant son login
    si le login est identifié le serveur accepte le client
    idem avec un autre client
    un client envoie au serveur un message, avec le login du client qui doit le recevoir
    le serveur route le message vers le bon client
    etc...

    Avant de me jeter dans le code, j'aimerais connaitre votre avis sur la manière à employer.
    Je me suis fixé la restriction de faire un code compilable aussi bien sur linux que windows.
    J'ai parcouru le forum, et le net à la recherche d'infos, plusieurs solutions me sont apparues :
    utiliser fork() : mais apparemment c'est que pour unixoides
    utiliser p_thread.h : mais ça a l'air bien compliqué
    utiliser select() : pas sur que cela suffise pour mon projet

    Donc pour le moment je penche plus pour l'utilisation de select().
    J'aimerais connaitre votre avis pour ne pas partir sur de mauvaises bases.

    Merci
    Sorry

  2. #2
    Membre averti Avatar de Jack_serious
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    350
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 350
    Points : 396
    Points
    396
    Par défaut Re: [Socket] Serveur gérant un dialogue entre plusieurs clie
    Citation Envoyé par sorry60
    Je souhaite réaliser une appli un petit plus compliquée que ce que j'ai fait jusqu'à présent avec les sockets.
    Simple question: tu es oblige de faire ca en C ?

    Un tel programme en Java se realise facilement, et avec la possibilite de faire un client graphique la aussi tres facilement.

    Tu evites plusieurs aspect lourds de la gestion de connexion inherents au C.

    Sinon, pour un serveur de ce type, je pense qu'il est logique (voir indispensable) de travailler en mode non-connecte. (Typiquement: UDP).

    Si le client envoie son identifiant une fois et que tu etablis une connexion avec lui, les messages etant par la suite episodiques, tu te retrouve avec des connexions non utilisees sur les bras.

    Il peut etre plus judicieux que le client construise une trame contenant son identifiant, un eventuel password encrypte, l'identifiant du destinataire et son message a chaque envoi.

  3. #3
    Membre actif Avatar de sorry60
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    802
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 802
    Points : 253
    Points
    253
    Par défaut Re: [Socket] Serveur gérant un dialogue entre plusieurs clie
    Citation Envoyé par Jack_serious
    Simple question: tu es oblige de faire ca en C ?
    Je n'ai aucune obligation, c'est mon choix.

  4. #4
    Membre expérimenté
    Inscrit en
    Décembre 2004
    Messages
    1 478
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 478
    Points : 1 664
    Points
    1 664
    Par défaut
    select() est effectivement la bonne solution. Les threads sont a eviter comme la peste : ils rendent le flux de logique difficile a suivre, ils posent des problemes de synchronisation horribles, etc. Un bon exemple est le serveur X des Unix et Linux. Il est entierement base sur une lecture asynchrone via select().

  5. #5
    Membre actif Avatar de sorry60
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    802
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 802
    Points : 253
    Points
    253
    Par défaut
    Ok donc je me lance.
    J'ai reflechi à la structure du programme serveur, voici ce que je pense faire :
    Les classiques :
    socket()
    bind()
    Ensuite une boucle infini :
    listen qui attend la connection d'un client
    recv du nom d'utilisateur
    si inconnu on ferme la connection avec ce client
    si ok on met son fd dans le select
    select en position d'attente
    routage des messages reçus vers les autres clients

    Ceci n'est encore que du théorique, il y a surement des erreurs.
    J'attend vos commentaires avant de me lancer dans le codage.

    Merci pour vos réponses
    Sorry

  6. #6
    Membre actif Avatar de sorry60
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    802
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 802
    Points : 253
    Points
    253
    Par défaut
    Apparemment mon schema ne doit pas etre bon, car j'ai testé et cela ne fonctionne pas...
    Voici le code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
     
    int main()
    {
    #if defined (_WIN32)
      WSADATA wsa_data;
      if ( WSAStartup(MAKEWORD(2,2),&wsa_data) != 0 )
      {
        perror("WSAStartup()");
        return 1;
      }
    #endif
      int err = 0;
      int user_tent_connect;
      /*Ensemble de socket surveillées en lecture */
      fd_set fds_lecture;
      FD_ZERO(&fds_lecture);
     
      /* Création de la socket */
      user_tent_connect = socket(PF_INET,SOCK_STREAM,0);
      if ( user_tent_connect != SOCKET_ERROR )
      {
        /* "bindage" de la socket */
        struct sockaddr_in addr;
     
        addr.sin_family = AF_INET;
        addr.sin_port = htons(PORT);
        addr.sin_addr.s_addr = (INADDR_ANY);
        err = bind(user_tent_connect,(struct sockaddr *) &addr, sizeof addr);
        if ( err != SOCKET_ERROR )
        {
          while(1)
          {
             /* Ecoute sur le port */
             printf("Attente de connexion sur le port %d...\n",PORT);
             err = listen(user_tent_connect,2);
             if ( err != SOCKET_ERROR )
             {
                /* Accept d'une connexion */
                int user_connecte;
                struct sockaddr_in user_addr;
                unsigned int size_user_addr = (int)sizeof(user_addr);
     
                user_connecte = accept(user_tent_connect,(struct sockaddr *) &user_addr,&size_user_addr);
                if ( user_connecte != -1 )
                {
                   char usr[64];
                   printf("Connexion de %s:%d sur le serveur...\n",inet_ntoa(user_addr.sin_addr),htons(user_addr.sin_port));
                  /* Reception du nom d'utilisateur */
                 err = recv(user_connecte,usr,sizeof usr,0);
                 if ( err != SOCKET_ERROR )
                 {
                    /* Authentification */
                   printf("Authentification en cours...\n");
                   err = authentification(usr);
                   if ( err != 404 )
                   {
                      printf("Authentification reussie...\n");
                      /* On place l'utilisateur venant de se connecter dans l'ensemble de lecture*/
                      FD_SET(user_connecte,&fds_lecture);
                     /* On attend que le serveur reçoive des données*/
                     while (select(0,&fds_lecture,NULL,NULL,NULL) == 0 )
                     {
                        ;
                     }
                     printf("Données arrivées...\n");
                 }
          /* Gestions des erreurs...*/
         /*...*/
       return 0;
    }
    Je lance le programme.
    Je lance un client, me connecte sur le serveur, lui envoie un premier message contenant le login, tout cela se passe bien mais apres, le select ne detecte aucune arrivée de données
    [Toma@tux Serveur]$ serveur
    Attente de connexion sur le port 4000...
    Connexion de 127.0.0.1:51829 sur le serveur...
    Authentification en cours...
    Toma vient de se connecter...
    Authentification reussie...

  7. #7
    Membre actif Avatar de sorry60
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    802
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 802
    Points : 253
    Points
    253
    Par défaut
    J'ai relu le man sur select, et je me suis apperçu que j'avais fais des grosses erreurs. Tout d'abord select ne renvoie pas le nombre d'octets lus mais le nombre de fd..
    De plus j'ai decouvert une macro tres interessante : FD_ISSET

    J'ai donc modifié mon code comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    printf("Authentification reussie...\n");
    /* On place l'utilisateur venant de se connecter dans l'ensemble de lecture*/
    FD_SET(user_connecte,&fds_lecture);
    select(user_connecte+1,&fds_lecture,NULL,NULL,NULL);
    /* On attend que le serveur reçoive des données*/
    if(FD_ISSET(user_connecte,&fds_lecture))
    {
      printf("Données arrivées...\n");
    }
    Je relance le prog, je relance le client, je me connecte, je m'identifie.
    Je renvoie un deuxieme message et j'ai bien :
    Données arrivées...
    En revanche ensuite le prog repart au niveau de ma boucle while(1), il faut donc que je la deplace..

    Et j'avoue aussi que le 1er parametre de la fonction select, j'ai mis un peu au hasard, je ne comprend pas trop ce que c'est..idem pour le 1er parametre de FD_ISSET, car là il ne lit que les donnees envoyées par un client..pas par tous

  8. #8
    Expert éminent sénior
    Avatar de Skyounet
    Homme Profil pro
    Software Engineer
    Inscrit en
    Mars 2005
    Messages
    6 380
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Software Engineer
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 6 380
    Points : 13 380
    Points
    13 380
    Par défaut
    Pour moi pas de fork (unixoïdes) pas de thread juste select et une liste (que tu dois implementer)

    Perso, je prendrai le C++ (parce que j'en ai deja fait un p-e ^^)
    En C++ une classe Client est une liste (avec la STL)

    Sinon en C c'est possible, une structure Client et une liste à implementer.

  9. #9
    Membre actif Avatar de sorry60
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    802
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 802
    Points : 253
    Points
    253
    Par défaut
    Citation Envoyé par Skyrunner
    Sinon en C c'est possible, une structure Client et une liste à implementer.
    Une liste de struct Client ?

  10. #10
    Expert éminent sénior
    Avatar de Skyounet
    Homme Profil pro
    Software Engineer
    Inscrit en
    Mars 2005
    Messages
    6 380
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Software Engineer
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 6 380
    Points : 13 380
    Points
    13 380
    Par défaut
    Citation Envoyé par sorry60
    Citation Envoyé par Skyrunner
    Sinon en C c'est possible, une structure Client et une liste à implementer.
    Une liste de struct Client ?
    Ouep

  11. #11
    Membre actif Avatar de sorry60
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    802
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 802
    Points : 253
    Points
    253
    Par défaut
    Citation Envoyé par Skyrunner
    Citation Envoyé par sorry60
    Citation Envoyé par Skyrunner
    Sinon en C c'est possible, une structure Client et une liste à implementer.
    Une liste de struct Client ?
    Ouep
    Bon ça fait environ 2ans que j'ai pas touché aux listes en C, ça ne peut que me faire un bon exercice ! je sens que mon week end va etre cool

    A+
    Sorry

  12. #12
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 379
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 379
    Points : 41 575
    Points
    41 575
    Par défaut
    Pour des serveurs avec select(), tu devrais peut-être chercher l'ancien topic "utilisation de select() pour faire un tchat", qui avait diqcuté de cela...

  13. #13
    Membre actif Avatar de sorry60
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    802
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 802
    Points : 253
    Points
    253
    Par défaut
    Citation Envoyé par Médinoc
    Pour des serveurs avec select(), tu devrais peut-être chercher l'ancien topic "utilisation de select() pour faire un tchat", qui avait diqcuté de cela...
    Oui en effet je l'ai lu, cela m'a appris beaucoup de choses.

  14. #14
    Membre actif Avatar de sorry60
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    802
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 802
    Points : 253
    Points
    253
    Par défaut
    Voila j'ai commencé le code.
    Mais ça ne marche pas du tout, et je trouve pas pourquoi...
    Voici le code (c'est assez long )
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
     
    int main()
    {
    #if defined (_WIN32)
    	WSADATA wsa_data;
      	if ( WSAStartup(MAKEWORD(2,2),&wsa_data) != 0 )
      	{
        	perror("WSAStartup()");
        	return 1;
      	}
    #endif
    	struct client* unClient = NULL;
      	int err = 0;
      	int max;
      	int s_ecoute;
      	/*Ensemble de socket surveillées en lecture */
      	fd_set fds_lecture;
      	FD_ZERO(&fds_lecture);
     
      	/* Création de la socket */
      	s_ecoute = socket(PF_INET,SOCK_STREAM,0);
      	max = s_ecoute;
      	if ( s_ecoute != SOCKET_ERROR )
      	{
       	/* "bindage" de la socket */
        	struct sockaddr_in myaddr;
        	struct sockaddr_in client_addr;
     
        	myaddr.sin_family = AF_INET;
        	myaddr.sin_port = htons(PORT);
        	myaddr.sin_addr.s_addr = (INADDR_ANY);
        	err = bind(s_ecoute,(struct sockaddr *) &myaddr, sizeof (myaddr));
        	if ( err != SOCKET_ERROR )
        	{
    			/* Ecoute sur le port */
    			printf("Attente de connexion sur le port %d...\n",PORT);
    			err = listen(s_ecoute,10);
    			if ( err != SOCKET_ERROR )
    			{
    				/* On met la socket d'ecoute dans l'ensemble de lecture */
    				FD_SET(s_ecoute,&fds_lecture);
    				while(1)
    				{
    	  				if ( select(max+1,&fds_lecture,NULL,NULL,NULL) != -1 )
    	  				{
    	  					/* On parcourt la liste des clients */
    	  					while( unClient )
    	  					{
    	  						/* Si il sait passer quelque chose dans l'emsemble de lecture avec ce client */
    	  						if ( FD_ISSET(unClient->fd,&fds_lecture))
    	  						{
    	  							/* Si c'est la socket d'ecoute ==> nouvelle connexion ! */
    	  							if ( unClient->fd == s_ecoute )
    	  							{
    	  								unsigned int size_client_addr = sizeof(client_addr);
    	  								int newClient = accept(s_ecoute,(struct sockaddr *)&client_addr,&size_client_addr);
    	  								int oct_rec;
    	  								if ( newClient != SOCKET_ERROR )
    	  								{
    	  									char login[16];
    	  									printf("Connexion d'un nouveau client : %s...\n",inet_ntoa(client_addr.sin_addr));
    	  									/* On attend la réception de son login */
    	  									oct_rec = recv(newClient,login,sizeof(login),0);
    	  									if ( oct_rec != - 1)
    	  									{
    	  										/* On procède à l'authentification du login */
    	  										int authent = authentification(login);
    	  										if ( authent == 0 )
    	  										{
    	  											/* Authentification reussie ! */
    	  											/* On met le nouveau client dans la liste */
    	  											ajouter_client(&unClient,login,"",newClient);
    	  											/* On le met aussi dans l'ensemble de lecture */
    	  											FD_SET(newClient,&fds_lecture);
    	  										}
    	  										else
    	  										{
    	  											/* Client inconnu ! */
    	  											char erreur404[] = "Désolé vous n'etes pas dans la base de donnees...\n";
    	  											int oct_env;
    	  											/* On envoie un message d'erreur au client inconnu */
    	  											oct_env = send(newClient,erreur404,sizeof(erreur404),0);
    	  											if ( oct_env == -1 )
    	  											{
    	  												perror("send() 404error");
    	  											}
    	  										}
    	  									}
    	  									else
    	  									{
    	  										perror("revc() login");
    	  									}
    	  								}
    	  								else
    	  								{
    	  									perror("accept()");
    	  								}
    	  							}
    	  							else
    	  							{
    	  								/* Le client en cours a fait une action ! */
    	  								int oct_rec;
    	  								int message[144];  /* 16 premiers octets pour le login du destinataire, le reste c'est le message */
     
    	  								oct_rec = recv(unClient->fd,message,sizeof(message),0);
    	  								if ( oct_rec <= 0 )
    	  								{
    	  									/* Erreur ou deconnexion client */
    	  								}
    	  								else
    	  								{
    	  									/* Le client a envoyé un message ! */
    	  								}
    	  							}
    	  						}
    	  						unClient = unClient->suivant;
    	  					} /* Fin du parcour de la liste */
    	  				}
    	  				else
    	  				{
    	  					perror("select()");
    	  				}
    	  			} /* Fin de la boucle infinie */
    	  		}
    			else
    			{
    	  			perror("listen()");
    			}
        	}
        	else
        	{
          	perror("bind()");
        	}
      	}
      	else
      	{
       	perror("socket()");
        	err = 1;
      	}
    #if defined (_WIN32)
    	WSACleanup();
    #endif
    	return err;
    }
    Le programme affiche :
    Attente de connexion sur le port 4000...
    Et c'est tout..quand je me connecte avec un client, rien ne se passe côté serveur

    Merci à ceux qui prendront le temps de lire le code pour m'aider car il est vraiment long quand meme..

  15. #15
    Membre actif Avatar de sorry60
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    802
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 802
    Points : 253
    Points
    253
    Par défaut
    A coup de printf, je me suis aperçu que le programme restait bloqué sur la fonction select

    Edit : j'auto-corrige les betises que je dis, c'est normal que select bloque, elle attend que quelque chose se passe sur s_ecoute...des qu'un client arrive, biensur que mon programme rentre dans la boucle while(1).
    Apres elle ne rentre jamais dans while(client), normal car ma liste est vide
    Je corrige ça et deja ça sera mieux

  16. #16
    Membre actif Avatar de sorry60
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    802
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 802
    Points : 253
    Points
    253
    Par défaut
    J'ai re-compilé mon code sous windows pour vérifier sa portabilité mais j'ai trois warnings que je n'avais pas sous linux..
    warning: comparison between signed and unsigned
    warning: comparison between signed and unsigned
    warning: passing arg 2 of `recv' from incompatible pointer type
    Les lignes de code correspondantes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    FD_SET(s_ecoute,&fds_lecture);
    FD_SET(newClient,&fds_lecture);
    oct_rec = recv(unClient->fd,message,sizeof(message),0);
    Les déclarations des variables :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    int s_ecoute = socket(PF_INET,SOCK_STREAM,0);
    fd_set fds_lecture;
    int newClient = accept(s_ecoute,(struct sockaddr *)&client_addr,&size_client_addr);
    int message[144];
    Quelqu'un a une idée du pourquoi du comment ?

  17. #17
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 379
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 379
    Points : 41 575
    Points
    41 575
    Par défaut
    ah, oui, c'est une subtilité de Windows: les sockets ne sont pas de type int, mais de type SOCKET, qui équivaut à unsigned int.

    Ce que je te conseille, c'est de les déclarer en type SOCKET. Si tu changes de plate-forme pour une plate-forme où SOCKET n'est pas un type reconnu, il te suffira de rajouter un "typedef int SOCKET;" plutôt que de tripoter ton code...

  18. #18
    Membre actif Avatar de sorry60
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    802
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 802
    Points : 253
    Points
    253
    Par défaut
    Citation Envoyé par Médinoc
    ah, oui, c'est une subtilité de Windows: les sockets ne sont pas de type int, mais de type SOCKET, qui équivaut à unsigned int.

    Ce que je te conseille, c'est de les déclarer en type SOCKET. Si tu changes de plate-forme pour une plate-forme où SOCKET n'est pas un type reconnu, il te suffira de rajouter un "typedef int SOCKET;" plutôt que de tripoter ton code...
    Ok merci pour l'info !

    Pour le dernier warning, euh j'ai du boire un peu trop à table, car j'ai déclaré un tableau de int au lieu de char...

  19. #19
    Membre actif Avatar de sorry60
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    802
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 802
    Points : 253
    Points
    253
    Par défaut
    J'ai donc déclaré mes sockets avec le type SOCKET mais maintenant j'ai pleins de warnings :
    warning: comparison between signed and unsigned
    Pour les lignes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    if ( s_ecoute != SOCKET_ERROR )
    if ( unClient->fd == s_ecoute ) /* unClient->fd est un int */
    if ( newClient != SOCKET_ERROR )
    /* etc... */
    Edit :
    J'ai corrigé la pluspart des warnings en remplaçant SOCKET_ERROR par INVALID_SOCKET, par contre, il me reste les warnings quand je compare la socket à un int. Un cast suffirait ?

  20. #20
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 379
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 379
    Points : 41 575
    Points
    41 575
    Par défaut
    Normalement, on n'est pas supposé comparer un socket avec SOCKET_ERROR. Mais on peut le comparer avec INVALID_SOCKET.


    Certaines mauvaises langues se plaignent que Windows oblige à utiliser des noms bizarres, et qualifient ça de non-portable. Au contraire, c'est fait pour être modifiable à tout moment avec un simple #define

Discussions similaires

  1. Plusieurs socket cliente sur une socket serveur en Java?
    Par loic911 dans le forum Développement
    Réponses: 3
    Dernier message: 11/06/2010, 07h47
  2. Dialogue entre serveur et client
    Par Carrel dans le forum Servlets/JSP
    Réponses: 2
    Dernier message: 03/07/2009, 06h48
  3. problème lors d'un dialogue entre client et serveur
    Par Dave62 dans le forum Réseau
    Réponses: 3
    Dernier message: 10/12/2008, 09h24
  4. Réponses: 3
    Dernier message: 31/10/2006, 10h34
  5. [Socket] Probleme entre un Client C et un serveur JAVA
    Par bpy1401 dans le forum API standards et tierces
    Réponses: 3
    Dernier message: 28/02/2006, 08h40

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo