begin process at 2012 05 30 17:25:27
  Trouver un code source :
 
dans
 
Accueil > Forum > 

Archive C/C++

 > 

Archives

 > 

Réseau / Internet

 > 

Socket Server/Client


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

Socket Server/Client

dimanche 22 mai 2005 à 21:06:59 | Socket Server/Client

XKaliBur

Membre Club

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 :
#include <winsock2.h>                        /*socket*/
#include <stdio.h>                            /*printf*/
#include <iostream>
#pragma comment(lib, "ws2_32.lib")

void main()
{
    char ip[256];
    std::cout << "IP : ";
    std::cin >> ip;
    std::cout << std::endl;

    WSADATA WSAData;
    WSAStartup(MAKEWORD(2,0), &WSAData);

    SOCKET sock;
    SOCKADDR_IN sin;
    char buffer[BUFSIZ];
    char msg[256];
   
    sin.sin_addr.s_addr = inet_addr(ip);
    sin.sin_family      = AF_INET;
    sin.sin_port        = htons(4444);
    sock = socket(AF_INET,SOCK_STREAM,0);
    bind(sock, (SOCKADDR *)&sin, sizeof(sin));

    connect(sock, (SOCKADDR *)&sin, sizeof(sin));

    while(1) {
        std::cout << "MSG : ";
        std::cin >> msg;
        sprintf(buffer, "%s\n", msg);
        send(sock, buffer, sizeof(buffer), 0);

        memset(buffer, '\0', BUFSIZ); /*on vide le buffer*/
        recv(sock, buffer, BUFSIZ-1, 0);
        printf("%s\n",buffer);
    }
}


--------------------------------------------------------------

Code du serveur :
#include <winsock2.h>                        /*socket*/
#include <stdio.h>                            /*printf*/
#pragma comment(lib, "ws2_32.lib")

void main()
{
    WSADATA WSAData;
    WSAStartup(MAKEWORD(2,0), &WSAData);

    SOCKET sock;
    SOCKET csock;
    SOCKADDR_IN sin;
    SOCKADDR_IN csin;
    char buffer[BUFSIZ];;
    sin.sin_addr.s_addr = htonl(INADDR_ANY);
    sin.sin_family      = AF_INET;
    sin.sin_port        = htons(4444);
    sock = socket(AF_INET,SOCK_STREAM,0);
    bind(sock, (SOCKADDR *)&sin, sizeof(sin));

    listen(sock,0);

    while(1) {
        memset(buffer, '\0', BUFSIZ); /*on vide le buffer*/
       
        int sinsize = sizeof(csin);
        csock = accept(sock, (SOCKADDR *)&csin, &sinsize);

        recv(csock, buffer, BUFSIZ-1, 0);
        printf("%s\n",buffer);

        if(strstr(buffer,"!salut")) {
            sprintf(buffer, "slt a toi\n");
            send(csock, buffer, sizeof(buffer), 0);
        }
    }
}


--------------------------------------------------------------

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".

dimanche 22 mai 2005 à 23:15:31 | Re : Socket Server/Client

aardman

Membre Club

Salut,
Pour que ton serveur puisse gerer plusieurs commandes, il faudrait faire une boucle while() juste apres le accept() et traiter les commandes recues dans cette boucle.

dimanche 22 mai 2005 à 23:20:34 | Re : Socket Server/Client

XKaliBur

Membre Club
Bon voila j'ai modifier mon serveur :

#include <winsock2.h>                        /*socket*/
#include <stdio.h>                            /*printf*/
#pragma comment(lib, "ws2_32.lib")
#include <windows.h>

void main()
{
    WSADATA WSAData;
    WSAStartup(MAKEWORD(2,0), &WSAData);

    SOCKET sock;
    SOCKET csock;
    SOCKADDR_IN sin;
    SOCKADDR_IN csin;
    char buffer[BUFSIZ];;
    sin.sin_addr.s_addr = htonl(INADDR_ANY);
    sin.sin_family      = AF_INET;
    sin.sin_port        = htons(4444);
    sock = socket(AF_INET,SOCK_STREAM,0);
    bind(sock, (SOCKADDR *)&sin, sizeof(sin));

    listen(sock,0);

    /* connection socket */
    int sinsize = sizeof(csin);
    csock = accept(sock, (SOCKADDR *)&csin, &sinsize);

    while(1) {
         memset(buffer, '\0', BUFSIZ); /*on vide le buffer*/
    
         recv(csock, buffer, BUFSIZ-1, 0);
         printf("%s\n",buffer);

         if(strstr(buffer,"!salut")) {
            sprintf(buffer, "slt a toi\n");
            send(csock, buffer, sizeof(buffer), 0);
         }
     }
}



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é :
else{
   sprintf(buffer, "envoi rate\n");
   send(csock, buffer, sizeof(buffer), 0);
}


Apres le :
if(strstr(buffer,"!salut")) {
...
}


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 :

 
dimanche 22 mai 2005 à 23:22:28 | Re : Socket Server/Client

XKaliBur

Membre Club
Ben déjà une commande qui marche ce serait bien après je verrais pour plusieurs.
lundi 23 mai 2005 à 01:14:58 | Re : Socket Server/Client

XKaliBur

Membre Club
Réponse acceptée !
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:
#include <winsock2.h>       /*socket*/
#include <stdio.h>              /*printf*/
#include <iostream>
#pragma comment(lib, "ws2_32.lib")

void main()
{
   char ip[256];
   std::cout << "IP : ";
   std::cin >> ip;
   std::cout << std::endl;

   WSADATA WSAData;
   WSAStartup(MAKEWORD(2,0), &WSAData);

   SOCKET sock;
   SOCKADDR_IN sin;
   char buffer[BUFSIZ];
   char msg[256];
   
   sin.sin_addr.s_addr = inet_addr(ip);
   sin.sin_family      = AF_INET;
   sin.sin_port        = htons(4444);
   sock = socket(AF_INET,SOCK_STREAM,0);
   bind(sock, (SOCKADDR *)&sin, sizeof(sin));

   connect(sock, (SOCKADDR *)&sin, sizeof(sin));

   while(1) {
  std::cout << "MSG : ";
  std::cin >> msg;

  memset(buffer, '\0', sizeof(buffer));
  sprintf(buffer, "%s\n", msg);
  send(sock, buffer, sizeof(buffer), 0);

  memset(buffer, '\0', sizeof(buffer));
  recv(sock, buffer, sizeof(buffer), 0);
  printf("%s\n",buffer);
   }

}


Server :
Code:
#include <winsock2.h>       /*socket*/
#include <stdio.h>         /*printf*/
#pragma comment(lib, "ws2_32.lib")

void main()
{

   WSADATA WSAData;
   WSAStartup(MAKEWORD(2,0), &WSAData);

   SOCKET sock;
   SOCKET csock;
   SOCKADDR_IN sin;
   SOCKADDR_IN csin;
   char buffer[BUFSIZ];;
   sin.sin_addr.s_addr = htonl(INADDR_ANY);
   sin.sin_family      = AF_INET;
   sin.sin_port        = htons(4444);
   sock = socket(AF_INET,SOCK_STREAM,0);
   bind(sock, (SOCKADDR *)&sin, sizeof(sin));

   listen(sock,0);

   /* connection socket */
   int sinsize = sizeof(csin);
   csock = accept(sock, (SOCKADDR *)&csin, &sinsize);

   while(1) {
   memset(buffer, '\0', sizeof(buffer)); /*on vide le buffer*/
   recv(csock, buffer, sizeof(buffer), 0);
   printf("%s",buffer);

   if(strstr(buffer,"!salut")) {
      sprintf(buffer, "tu as dit salut\n");
      send(csock, buffer, sizeof(buffer), 0);
      printf("rply-> %s\n",buffer);
   }

   if(strstr(buffer,"!hello")) {
      sprintf(buffer, "tu as dit hello\n");
      send(csock, buffer, sizeof(buffer), 0);
      printf("rply-> %s\n",buffer);
   }
  }
}

Voila peut-être que ça poura aider quelqu'un.


Cette discussion est classée dans : buffer, socket, sin, sock, sockaddr


Répondre à ce message

Sujets en rapport avec ce message

PROB SOCKETS CON [ par zzzzzz ] le code source marche mais quand je rajoute un cout#include #pragma comment(lib,"ws2_32.lib")#include int main(void) LERREUR QUI TUE §§§§§§§§§§§§§§§§ [ par Avalon10101 ] Vla jai fé mon prog tout é juste mais ya une erreur que je narrive vraiment pas à comprendre ! :C:\Documents and Settings\Alex\Mes documents\Makefile. Probleme de Client Serveur [ par Krox68 ] voila jaimerais faire un programme client qui puisse se connecter a ce serveur : #include void main(){ WSADATA WSAData; WSAStartup(MAKEWORD(2,0), &WS prob sock [ par epoc ] voilà, g commencé la prog des socks en vc++, mais rien ne transitte alors que la connexion semble être bien effectuée, voilà le code :**************** Problème de Socket(recv) [ par YnOThAr ] Voila je suis en train d'essayer de faire un client FTp mais j'ai vraiment du mal...mon preblème c ke j'arrive pas à réceptionner les réponses du serv Liaison client/serveur (socket) [ par bthivent ] Bonjour !J'ai suivi un tutorial pour apprendre les sockets. J'ai ensuite essaiyé un exemple qu'ils proposaient, voici mon code qui permet de faire un link avec GCC [ par mrjulien ] Bonjours a tous.Je compile avec gcc sous windows (grâce a mingw). Je ne souhaite pas vous ennuyer en créant un topic redondant, mais je n'arrive pas à socket envoie de text d'apres un fichier [ par hijakhakker ] salutj'utilise recement les socket et je teste une source qui utilise les socket pour envoyer hello world a qui se connect :#include #pragma comment(l Socket en C [ par RM50Man ] WSADATA ws;                    WSAStartup(MAKEWORD(2,0), &ws);              &n probleme de communication entre deux programme [ par smook ] re salut le dernier message que j ai poster c etait pour les socket et la librairie "libwsock.a" mais sayer j ai passer cette etape j ai reussi a fair


Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Mai 2012
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

Consulter la suite du CalendriCode

Photothèque

A découvrir



 
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 : 3,775 sec (4)

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