Problème de sockets...

Signaler
Messages postés
746
Date d'inscription
vendredi 17 juin 2005
Statut
Membre
Dernière intervention
23 mai 2007
-
Messages postés
746
Date d'inscription
vendredi 17 juin 2005
Statut
Membre
Dernière intervention
23 mai 2007
-
Bonjour ! J'essaie en ce moment de programmer un serveur multithread qui servira(peut-être) à un projet de MMORPG. Le serveur fonctionne normalement, la connexion à la base de données aussi, mais c'est au niveau du client que j'ai un problème. Le serveur envoie avec send() la chaine "Bonjour !". Dans le client, on truve ceçi :

char* buffer = new char[255];
recv(soc, buffer, sizeof(buffer), 0);
cout << buffer << endl;

Mais au lieu de m'afficher "Bonjour !" comme prévu, il m'affiche une chose assez bizarre, constituée de signes = et ²... Comment pourrais-je résoudre le problème ?

Merci d'avance.

8 réponses

Messages postés
1905
Date d'inscription
mercredi 22 janvier 2003
Statut
Membre
Dernière intervention
17 septembre 2012
3
Salut,

Tu dois surement envoyer la chaine sans son \0 final, et comme a la
reception tu ne le rajoute pas, et bien ca t'affiche plein de truc
bizzares..
Messages postés
746
Date d'inscription
vendredi 17 juin 2005
Statut
Membre
Dernière intervention
23 mai 2007
10
Merci ! C'est vrai, je viens de me rendre compte que j'ai oublié le buffer = {0}...
Erreur de ma part. J'espère que ça marchera.
Messages postés
1905
Date d'inscription
mercredi 22 janvier 2003
Statut
Membre
Dernière intervention
17 septembre 2012
3
Salut,

Je sais pas trop ce que le buffer = {0} va donner sur un tableau alloué avec new.

J'aurais plutot fait:

int r = recv(...);

buffer[r] = '\0';
Messages postés
746
Date d'inscription
vendredi 17 juin 2005
Statut
Membre
Dernière intervention
23 mai 2007
10
J'ai essayé de mettre des cout de debuggage, et je me suis rendu compte que à la connexion, l'instruction connect renvoyé une valeur SOCKET_ERROR...

A mon avis le probleme doit venir de la...

Le code est :

cout << "Connexion au serveur..." << endl;
char* buffer = new char[255];
WSADATA wsaData;
if(WSAStartup(MAKEWORD(2, 0), &wsaData))
{
cout << "Impossible de se connecter..." << endl;
return 1;
}


SOCKET sock;
SOCKADDR_IN sin;
sin.sin_addr.s_addr = inet_addr("127.0.0.1");
sin.sin_family = AF_INET;
sin.sin_port = htons(80);

cout << "Création du socket..." << endl; if((sock socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) INVALID_SOCKET)
{
cout << "Erreur de connexion..." << endl;
return 1;
}
if(bind(sock, (SOCKADDR*)&sin, sizeof(sin)) == SOCKET_ERROR)
{
cout << "Erreur de connexion..." << endl;
return 1;
}

cout << "Rattachement au serveur..." << endl;
if(connect(sock, (SOCKADDR*)&sin, sizeof(sin)) == SOCKET_ERROR)
{
cout << "Erreur de connexion..." << endl;
return 1;
}
cout << "Attente du message de bienvenue..." << endl;
recv(sock, buffer, sizeof(buffer), 0);


cout << buffer << endl;


if(strcmp(buffer, "Bonjour !"))
{
cerr << "La chaine a étée mal recue par le client..." << endl;
}

Si quelqu'un voit où est l'erreur, ça pourrait surement m'interesser...
Messages postés
1905
Date d'inscription
mercredi 22 janvier 2003
Statut
Membre
Dernière intervention
17 septembre 2012
3
Salut,

En fait, tu te bind sur 127.0.0.1:80 et ensuite tu essayes de te
connecter sur cette meme adresse... ce qui est completement absurde!
L'erreur vient peut etre du fait que tu utilises la meme structure
sockaddr_in pour le bind() et le connect() alors que ces 2 adresses ne
representent pas du tout la meme chose (bind=adresse locale,
connect=adresse distante).

De plus, lorsque tu appeles connect() sur un socket, tu n'a pas besoin
de le binder avant, c'est automatique (sauf bien sur, si tu souhaites
toi meme choisir l'adresse locale).

Et enfin, lorsqu'une fonction de winsock retourne SOCKET_ERROR, il faut
appeler WSAGetLastError() pour avoir un numéro d'erreur winsock, et
l'afficher.
Messages postés
700
Date d'inscription
mardi 30 décembre 2003
Statut
Membre
Dernière intervention
27 janvier 2009
4
salut,
si tu fais ca:
char* buffer = new char[255];
alors sizeof(buffer) vaut 4, c'est a dire la taille d'un pointeur (qui est codé sur 4 octets puisqu'une adresse est representé par un entier)
Si tu connais la taille d'un tableau a la compilation (ici c 255), pas la peine de faire une allocation dynamique.
fais
char buffer[255];

voila un code propre pour recevoir des donnees:

char buffer[256];
int r = recv(soc, buffer, sizeof(buffer) - 1, 0); // bien mettre sizeof(buffer)-1
// pour pouvoir placer le 0 terminal sans overflow
if (r >= 0)
{
buffer[r] = 0;
cout << buffer << endl;
}
else
cout << "erreur a la reception." << endl;

a+
Messages postés
746
Date d'inscription
vendredi 17 juin 2005
Statut
Membre
Dernière intervention
23 mai 2007
10
Ok merci pour tout ! L'erreur du bind vient en fait d'un tutorial que j'avais trouvé sur developpez.com... Par contre, je retrouve toujours la même erreur au connect(), et la fonction WSAGetLastError() me renvoie 10061, qui n'est pas très clair pour moi...

Quelqu'un pourrait-il deja me dire a quoi correspond cette erreur, et comment la corriger ?
Messages postés
746
Date d'inscription
vendredi 17 juin 2005
Statut
Membre
Dernière intervention
23 mai 2007
10
Je viens de regarder sur la MSDN, et elle me dit ceci sur l'erreur 10061 : que c'est parce que le socket se connecte sur un serveur qui n'existe pas ! Pourtant, j'ai mis des "cout de debuggage" à peu près partout dans le serveur, et il me dit qu'il n'y a aucune erreur...

J'ai aussi essayé autre chose : mon serveur fonctionnant sur le port 80 (decision provisoire bien sur), j'ai fait fonctionner le serveur Apache de EasyPHP en même temps. Et la, EasyPHP me dit que le port est utilisé... Ce n'est pas une preuve que mon serveur marche ?

Je posterais le code source du serveur après, car je dois d'abord modifier les paramètres de connexion MySQL (je ne vais pas vous les donner quand même...).

En espérant que vous pourrez m'aider...