Socket Server/Client

Résolu
XKaliBur Messages postés 45 Date d'inscription vendredi 20 février 2004 Statut Membre Dernière intervention 13 février 2007 - 22 mai 2005 à 21:06
XKaliBur Messages postés 45 Date d'inscription vendredi 20 février 2004 Statut Membre Dernière intervention 13 février 2007 - 23 mai 2005 à 01:14
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

XKaliBur Messages postés 45 Date d'inscription vendredi 20 février 2004 Statut Membre Dernière intervention 13 février 2007
23 mai 2005 à 01:14
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.
3
cs_aardman Messages postés 1905 Date d'inscription mercredi 22 janvier 2003 Statut Membre Dernière intervention 17 septembre 2012 3
22 mai 2005 à 23:15
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.
0
XKaliBur Messages postés 45 Date d'inscription vendredi 20 février 2004 Statut Membre Dernière intervention 13 février 2007
22 mai 2005 à 23:20
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 :
0
XKaliBur Messages postés 45 Date d'inscription vendredi 20 février 2004 Statut Membre Dernière intervention 13 février 2007
22 mai 2005 à 23:22
Ben déjà une commande qui marche ce serait bien après je verrais pour plusieurs.
0
Rejoignez-nous