|
Trouver une ressource
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)
Informations & options pour cette discussion
lundi 26 décembre 2005 à 15:05:02 |
Problème de sockets...

nightlord666
|
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
|
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
|
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
|
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
|
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
|
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
|
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
|
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
Livres en rapport
|
Téléchargements
Logiciels à télécharger sur le même thème :
Comparez les prix Nouvelle version
|