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

Développement Discussion :

[C/C++]Socket Server/Client


Sujet :

Développement

  1. #1
    Membre à l'essai
    Inscrit en
    Janvier 2005
    Messages
    19
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 19
    Points : 17
    Points
    17
    Par défaut [C/C++]Socket Server/Client
    Je suis débutant et je voudrais faire en sorte d'envoyer un message au mon serveur et des que ce dernier reçoit un message, il réponde en fonction de se qui associé au message reçut : par exemple si j'envois au serveur le message '!salut" il réponde par un "slt a toi".

    Code du client :
    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
    #include <winsock2.h>                        /*socket*/
    #include <stdio.h>                            /*printf*/
    #include <iostream>
    #pragma comment&#40;lib, "ws2_32.lib"&#41;
    
    void main&#40;&#41;
    &#123;
        char ip&#91;256&#93;;
        std&#58;&#58;cout << "IP &#58; ";
        std&#58;&#58;cin >> ip;
        std&#58;&#58;cout << std&#58;&#58;endl;
    
        WSADATA WSAData;
        WSAStartup&#40;MAKEWORD&#40;2,0&#41;, &WSAData&#41;;
    
        SOCKET sock;
        SOCKADDR_IN sin;
        char buffer&#91;BUFSIZ&#93;;
        char msg&#91;256&#93;;
       
        sin.sin_addr.s_addr = inet_addr&#40;ip&#41;;
        sin.sin_family      = AF_INET;
        sin.sin_port        = htons&#40;4444&#41;;
        sock = socket&#40;AF_INET,SOCK_STREAM,0&#41;;
        bind&#40;sock, &#40;SOCKADDR *&#41;&sin, sizeof&#40;sin&#41;&#41;;
    
        connect&#40;sock, &#40;SOCKADDR *&#41;&sin, sizeof&#40;sin&#41;&#41;;
    
        while&#40;1&#41; &#123;
            std&#58;&#58;cout << "MSG &#58; ";
            std&#58;&#58;cin >> msg;
            
            memset&#40;buffer, '\0', BUFSIZ&#41;;
            sprintf&#40;buffer, "%s\n", msg&#41;;
            send&#40;sock, buffer, sizeof&#40;buffer&#41;, 0&#41;;
    
            memset&#40;buffer, '\0', BUFSIZ&#41;; /*on vide le buffer*/
            recv&#40;sock, buffer, BUFSIZ-1, 0&#41;;
            printf&#40;"%s\n",buffer&#41;;
        &#125;
    &#125;
    --------------------------------------------------------------

    Code du serveur :
    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
    #include <winsock2.h>                        /*socket*/
    #include <stdio.h>                            /*printf*/
    #pragma comment&#40;lib, "ws2_32.lib"&#41;
    
    void main&#40;&#41;
    &#123;
        WSADATA WSAData;
        WSAStartup&#40;MAKEWORD&#40;2,0&#41;, &WSAData&#41;;
    
        SOCKET sock;
        SOCKET csock;
        SOCKADDR_IN sin;
        SOCKADDR_IN csin;
        char buffer&#91;BUFSIZ&#93;;;
        sin.sin_addr.s_addr = htonl&#40;INADDR_ANY&#41;;
        sin.sin_family      = AF_INET;
        sin.sin_port        = htons&#40;4444&#41;;
        sock = socket&#40;AF_INET,SOCK_STREAM,0&#41;;
        bind&#40;sock, &#40;SOCKADDR *&#41;&sin, sizeof&#40;sin&#41;&#41;;
    
        listen&#40;sock,0&#41;;
    
        while&#40;1&#41; &#123;
            memset&#40;buffer, '\0', BUFSIZ&#41;; /*on vide le buffer*/
           
            int sinsize = sizeof&#40;csin&#41;;
            csock = accept&#40;sock, &#40;SOCKADDR *&#41;&csin, &sinsize&#41;;
    
            recv&#40;csock, buffer, BUFSIZ-1, 0&#41;;
            printf&#40;"%s\n",buffer&#41;;
    
            if&#40;strstr&#40;buffer,"!salut"&#41;&#41; &#123;
                sprintf&#40;buffer, "slt a toi\n"&#41;;
                send&#40;csock, buffer, sizeof&#40;buffer&#41;, 0&#41;;
            &#125;
        &#125;
    &#125;
    --------------------------------------------------------------

    Mon problème c'est que quand j'envoi un premier "!salut" il me répond bien par "slt a toi" mais après ça ne marche plus, j'ai le prompt "MSG : " sur le client qui s'affiche deux fois et après plus rien, et pendant ce temps la sur le serveur il ne c'est afficher qu'une seul fois"!salut".

  2. #2
    Membre à l'essai
    Inscrit en
    Janvier 2005
    Messages
    19
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 19
    Points : 17
    Points
    17
    Par défaut
    Bon voila j'ai modifier mon serveur :

    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
    #include <winsock2.h>						/*socket*/
    #include <stdio.h>							/*printf*/
    #pragma comment&#40;lib, "ws2_32.lib"&#41;
    #include <windows.h>
    
    void main&#40;&#41;
    &#123;
    	WSADATA WSAData;
    	WSAStartup&#40;MAKEWORD&#40;2,0&#41;, &WSAData&#41;;
    
    	SOCKET sock;
    	SOCKET csock;
    	SOCKADDR_IN sin;
    	SOCKADDR_IN csin;
    	char buffer&#91;BUFSIZ&#93;;;
    	sin.sin_addr.s_addr = htonl&#40;INADDR_ANY&#41;;
    	sin.sin_family      = AF_INET;
    	sin.sin_port        = htons&#40;4444&#41;;
    	sock = socket&#40;AF_INET,SOCK_STREAM,0&#41;;
    	bind&#40;sock, &#40;SOCKADDR *&#41;&sin, sizeof&#40;sin&#41;&#41;;
    
    
    	listen&#40;sock,0&#41;;
    
    
    	listen&#40;sock,0&#41;;
    
    	/* connection socket */
    	int sinsize = sizeof&#40;csin&#41;;
    	csock = accept&#40;sock, &#40;SOCKADDR *&#41;&csin, &sinsize&#41;;
    
    	while&#40;1&#41; &#123;
    		 memset&#40;buffer, '\0', BUFSIZ&#41;; /*on vide le buffer*/
    	
    		 recv&#40;csock, buffer, BUFSIZ-1, 0&#41;;
    		 printf&#40;"%s\n",buffer&#41;;
    
    		 if&#40;strstr&#40;buffer,"!salut"&#41;&#41; &#123;
    		    sprintf&#40;buffer, "slt a toi\n"&#41;;
    		    send&#40;csock, buffer, sizeof&#40;buffer&#41;, 0&#41;;
    		 &#125;
    
    	 &#125;
    
    &#125;

    Mais le nouveau problème c'est que le serveur ne me renvois pas tout le temps le "slt a toi". Il me renvois parfois des blancs...

    Alors j'ai rajouté :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    else&#123;
       sprintf&#40;buffer, "envoi rate\n"&#41;;
       send&#40;csock, buffer, sizeof&#40;buffer&#41;, 0&#41;;
    &#125;
    Apres le :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    if&#40;strstr&#40;buffer,"!salut"&#41;&#41; &#123;
    ...
    &#125;
    Mais le client continu a recevoir des blanc malgré ce "else".

    Alors si quelqu'un a une idée...
    Merci d'avance.

    PS : Voila à quoi ça ressemble pour mieux comprendre :


  3. #3
    Membre à l'essai
    Inscrit en
    Janvier 2005
    Messages
    19
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 19
    Points : 17
    Points
    17
    Par défaut
    Bon par manque d'envit de dormir j'ai finalement reussit à trouver le problème : remplacer tout les "BUFSIZ" et "BUFSIZE-1" par "sizeof(buffer)" et ça marche.

    Client :
    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
    #include <winsock2.h>    	/*socket*/
    #include <stdio.h>      	/*printf*/
    #include <iostream>
    #pragma comment&#40;lib, "ws2_32.lib"&#41;
    
    void main&#40;&#41;
    &#123;
    	char ip&#91;256&#93;;
    	std&#58;&#58;cout << "IP &#58; ";
    	std&#58;&#58;cin >> ip;
    	std&#58;&#58;cout << std&#58;&#58;endl;
    
    	WSADATA WSAData;
    	WSAStartup&#40;MAKEWORD&#40;2,0&#41;, &WSAData&#41;;
    
    	SOCKET sock;
    	SOCKADDR_IN sin;
    	char buffer&#91;BUFSIZ&#93;;
    	char msg&#91;256&#93;;
    	
    	sin.sin_addr.s_addr = inet_addr&#40;ip&#41;;
    	sin.sin_family      = AF_INET;
    	sin.sin_port        = htons&#40;4444&#41;;
    	sock = socket&#40;AF_INET,SOCK_STREAM,0&#41;;
    	bind&#40;sock, &#40;SOCKADDR *&#41;&sin, sizeof&#40;sin&#41;&#41;;
    
    	connect&#40;sock, &#40;SOCKADDR *&#41;&sin, sizeof&#40;sin&#41;&#41;;
    
    	while&#40;1&#41; &#123;
      std&#58;&#58;cout << "MSG &#58; ";
      std&#58;&#58;cin >> msg;
    
      memset&#40;buffer, '\0', sizeof&#40;buffer&#41;&#41;;
      sprintf&#40;buffer, "%s\n", msg&#41;;
      send&#40;sock, buffer, sizeof&#40;buffer&#41;, 0&#41;;
    
      memset&#40;buffer, '\0', sizeof&#40;buffer&#41;&#41;;
      recv&#40;sock, buffer, sizeof&#40;buffer&#41;, 0&#41;;
      printf&#40;"%s\n",buffer&#41;;
    	&#125; 
    
    &#125;
    Server :
    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
    #include <winsock2.h>    	/*socket*/
    #include <stdio.h>      	/*printf*/
    #pragma comment&#40;lib, "ws2_32.lib"&#41;
    
    void main&#40;&#41;
    &#123;
    
    	WSADATA WSAData;
    	WSAStartup&#40;MAKEWORD&#40;2,0&#41;, &WSAData&#41;;
    
    	SOCKET sock;
    	SOCKET csock;
    	SOCKADDR_IN sin;
    	SOCKADDR_IN csin;
    	char buffer&#91;BUFSIZ&#93;;;
    	sin.sin_addr.s_addr = htonl&#40;INADDR_ANY&#41;;
    	sin.sin_family      = AF_INET;
    	sin.sin_port        = htons&#40;4444&#41;;
    	sock = socket&#40;AF_INET,SOCK_STREAM,0&#41;;
    	bind&#40;sock, &#40;SOCKADDR *&#41;&sin, sizeof&#40;sin&#41;&#41;;
    
    	listen&#40;sock,0&#41;;
    
    	/* connection socket */
    	int sinsize = sizeof&#40;csin&#41;;
    	csock = accept&#40;sock, &#40;SOCKADDR *&#41;&csin, &sinsize&#41;;
    
    	while&#40;1&#41; &#123;
       memset&#40;buffer, '\0', sizeof&#40;buffer&#41;&#41;; /*on vide le buffer*/
       recv&#40;csock, buffer, sizeof&#40;buffer&#41;, 0&#41;;
       printf&#40;"%s",buffer&#41;;
    
       if&#40;strstr&#40;buffer,"!salut"&#41;&#41; &#123;
          sprintf&#40;buffer, "tu as dit salut\n"&#41;;
          send&#40;csock, buffer, sizeof&#40;buffer&#41;, 0&#41;;
          printf&#40;"rply-> %s\n",buffer&#41;;
       &#125; 
    
       if&#40;strstr&#40;buffer,"!hello"&#41;&#41; &#123;
          sprintf&#40;buffer, "tu as dit hello\n"&#41;;
          send&#40;csock, buffer, sizeof&#40;buffer&#41;, 0&#41;;
          printf&#40;"rply-> %s\n",buffer&#41;;
       &#125;
      &#125;
    &#125;
    Voila peut-être que ça poura aider quelqu'un.

  4. #4
    Futur Membre du Club
    Inscrit en
    Décembre 2006
    Messages
    4
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 4
    Points : 5
    Points
    5
    Par défaut
    merciiiiiiiiiiiiiiiiiiiii

  5. #5
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2012
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2012
    Messages : 6
    Points : 7
    Points
    7
    Par défaut
    merci X-K4l1 pour votre exemple riche , mais je l'ai exécuté et le serveur ne me renvois pas toujours le "salut a toi", ça marche pour la première fois mais il s’arrête après ou est le problème ?

  6. #6
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2012
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2012
    Messages : 6
    Points : 7
    Points
    7
    Par défaut
    C'est bon j'ai trouvé la solution dans ton recv(csock, buffer, sizeof(buffer), 0); il faut pas utiliser un sizeof(buffer) mais la taille exact de ton buffer envoyé,
    dans votre cas c'est BUFSIZ=512 , c'est à dire ton recv devient recv(csock, buffer, 512, 0);

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Problème socket server/client
    Par yazidou27 dans le forum Web & réseau
    Réponses: 18
    Dernier message: 23/12/2010, 18h26
  2. Réponses: 4
    Dernier message: 09/04/2010, 10h42
  3. [Débutant][Sockets] Server en C++, client en Java
    Par mavina dans le forum Réseau
    Réponses: 16
    Dernier message: 05/10/2009, 03h45
  4. [Routeur/Socket] Connection Client/Serveur
    Par Clorish dans le forum Développement
    Réponses: 3
    Dernier message: 17/12/2003, 13h45

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