begin process at 2012 02 12 10:25:16
  Trouver un code source :
 
dans
 
Accueil > Forum > 

Archive C/C++

 > 

Archives

 > 

Au secours

 > 

Problème de sockets...


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

Problème de sockets...

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ée 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

Février 2012
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
272829    

Consulter la suite du CalendriCode

Photothèque

 
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 : 0,796 sec (3)

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