Socket Server/Client [Résolu]

Signaler
Messages postés
45
Date d'inscription
vendredi 20 février 2004
Statut
Membre
Dernière intervention
13 février 2007
-
Messages postés
45
Date d'inscription
vendredi 20 février 2004
Statut
Membre
Dernière intervention
13 février 2007
-
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

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

4 réponses

Messages postés
45
Date d'inscription
vendredi 20 février 2004
Statut
Membre
Dernière intervention
13 février 2007

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

#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.
Messages postés
1905
Date d'inscription
mercredi 22 janvier 2003
Statut
Membre
Dernière intervention
17 septembre 2012
3
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.
Messages postés
45
Date d'inscription
vendredi 20 février 2004
Statut
Membre
Dernière intervention
13 février 2007

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 :
Messages postés
45
Date d'inscription
vendredi 20 février 2004
Statut
Membre
Dernière intervention
13 février 2007

Ben déjà une commande qui marche ce serait bien après je verrais pour plusieurs.