Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum. Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

Sujet : Problème de sockets... [ Archives / Au secours ] (nightlord666)

lundi 26 décembre 2005 à 15:05:02 | Problème de sockets...

nightlord666

Membre Club

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.


lundi 26 décembre 2005 à 17:15:49 | Re : Problème de sockets...

aardman

Membre Club
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..


lundi 26 décembre 2005 à 18:23:31 | Re : Problème de sockets...

nightlord666

Membre Club
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.

lundi 26 décembre 2005 à 19:45:51 | Re : Problème de sockets...

aardman

Membre Club
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';



lundi 26 décembre 2005 à 21:35:31 | Re : Problème de sockets...

nightlord666

Membre Club

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


lundi 26 décembre 2005 à 22:31:16 | Re : Problème de sockets...

aardman

Membre Club
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.


lundi 26 décembre 2005 à 22:33:49 | Re : Problème de sockets...

cosmobob

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+

mardi 27 décembre 2005 à 14:59:17 | Re : Problème de sockets...

nightlord666

Membre Club
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 ?

mardi 27 décembre 2005 à 18:04:23 | Re : Problème de sockets...

nightlord666

Membre Club
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...



Cette discussion est classé dans : buffer, problème, serveur, client, sockets


Répondre à ce message

Sujets en rapport avec ce message

probleme serveur-client [ par dorian2031 ] ben voila le probleme, dans mon serveur-clientmon client envoi bien un message avec : char buffer[1024]="slt a toi\0";.... send(serveur,buffer,1024, sockets!!!!!!!!!!!!!!! [ par dletozeun ] bonjour,J'ai encore un probleme avec les sockets:voila, g reussi a faire communiquer un serveur et un client su r 2 ordinateur distant mais cette conn Sockets asychrones et client serveur TCP [ par argali ] Bonjour,Est-ce qqun pourrait m'indiquer ou je pourrai trouver un cours complet sur les sockets asynchrones et leurs options (WSAAsyncSelect, FD_ACCEPT Thread, Client/Serveur VC++.Net et avec WinForms ( pas d'MFC ) [ par lacousine ] Bonjour,j'ai développé un serveur qui accept plusieurs clients avec des sockets. Voici mes problèmes: lorsque je veux mettre fin à mon serveur et qu'i problemme avec les sockets [ par sirion ] Bonjour, j'ai un petit problemme avec les sockets. donc voila, j'ai essayer de faire un serveur/client qui recois 2msg chacun,  mais ca merdouille du Communication Client/Serveur ! Ou es le problème ? [ par QuakeCoder ] Je recentre fréquemment un problème avec l’utilisation de socket et la communication entre Client/Server.   Prenant un exemple de ma dernière appl Récupérer l'IP du client (SOCKETS) dans une app client/serveur [ par supergrey ] Bonjour, je voudrais savoir comment récupérer l'IP du client a partir du programme serveur après le sock=accept(...);Merci d'avance ! problème serveur client en C [ par lenneth666 ] voilà j'ai fais un serveur et un client. Alors pour envoyer un message du serveur vers le client il n'y a aucun problème par contre l'inverse ne march problème serveur TCP en C [ par lenneth666 ] Bonjour j'ai essayé de faire un client server TCP en C mais mon serveur bloque a l'instruction suivante : client_socket = accept( ma_socket,(struct Problème WinSock... [ par Vermifuge ] Bonjour tout le monde, j'ai une réaction étrange de WinSock, et comme je trouve pas j'ai pensé que quelqu'un avait déjà eu ce problème ( c'est la prem


Nos sponsors

Sondage...

CalendriCode

Juillet 2009
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
2728293031  

Consulter la suite du CalendriCode

Téléchargements

Logiciels à télécharger sur le même thème :

Comparez les prix Nouvelle version

Photothèque Nouveau !



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
Temps d'éxécution de la page : 0,328 sec

Google Coop CodeS-SourceS Google Coop CodeS-SourceS


Certaines images présentes sur le site (notament certains avatars) sont issues des collections IconShock, donc si vous souhaitez utiliser ces icons vous devez les acheter, ne les copiez pas et ne utilisez pas dans vos sites et applications sans les avoir commandé.