Prob avec les sockets

Résolu
Sload Messages postés 23 Date d'inscription samedi 25 octobre 2003 Statut Membre Dernière intervention 21 juillet 2005 - 25 avril 2005 à 19:56
Sload Messages postés 23 Date d'inscription samedi 25 octobre 2003 Statut Membre Dernière intervention 21 juillet 2005 - 26 avril 2005 à 23:35
Bonjour à tous !

Voila mon probleme , j'essaye de develloper un logiciel client/serveur.

Je n'en suis qu'au tout début et j'ai déja un probleme lol !



Voila le code du serveur :

_______________________________________________________________

#include <cstdlib>

#include

#include <cstring>

#include <winsock2.h>

#pragma comment(lib, "ws2_32.lib")





using namespace std;



int main(int argc, char *argv[])

{

char *texte = new char[255];



WSADATA WSAData;

WSAStartup(MAKEWORD(2,0), &WSAData);

SOCKET sock;

SOCKET csock;

SOCKADDR_IN sin;

SOCKADDR_IN csin;

sock = socket(AF_INET, SOCK_STREAM, 0);

sin.sin_addr.s_addr = INADDR_ANY;

sin.sin_family = AF_INET;

sin.sin_port = htons(23);

bind(sock, (SOCKADDR *)&sin, sizeof(sin));

listen(sock, 0);

while(1)

{

int sinsize = sizeof(csin);

if((csock = accept(sock, (SOCKADDR *)&csin, &sinsize)) != INVALID_SOCKET)

{

cout << "Client connecte !\n";

texte = "Connexion avec le Serveur OK !";



send(csock, texte, strlen(texte), 0);

cout << "Texte envoye : " << texte << "\n";

cout
<< "Taille du texte envoye : " << strlen(texte) <<
"\n";

}

}



system("PAUSE");

return EXIT_SUCCESS;

}

___________________________________________________________________



et celui du client : ___________________________________________________________________

#include <cstdlib>

#include

#include <winsock2.h>

#include <cstring>

#pragma comment(lib, "ws2_32.lib")



using namespace std;



int main(int argc, char *argv[])

{

WSADATA WSAData;

WSAStartup(MAKEWORD(2,0), &WSAData);

SOCKET sock;

SOCKADDR_IN sin;

char *buffer = new char[255];

sock = socket(AF_INET, SOCK_STREAM, 0);

sin.sin_addr.s_addr = inet_addr("127.0.0.1");

sin.sin_family = AF_INET;

sin.sin_port = htons(23);

connect(sock, (SOCKADDR *)&sin, sizeof(sin));

recv(sock, buffer, strlen(buffer), 0);

cout << "Texte recu : " << buffer;

cout << "Taille du texte recu : " << strlen(buffer);

closesocket(sock);

WSACleanup();

int a;

cin >> a;



system("PAUSE");

return EXIT_SUCCESS;

}

___________________________________________________________________



Le probleme c'est que le client recoit ne recoit que les 3 premiers caractères soit "con" .

Avez vous une idée de la raison ?

En vous remerciant

Antoine PACAUD

http:\\www.sloadnet.com

5 réponses

NitRic Messages postés 402 Date d'inscription mardi 1 mai 2001 Statut Membre Dernière intervention 15 août 2011
26 avril 2005 à 01:54
En effet car `buffer` est un pointeur.



Au fait, fait attention car `recv()` n'assure pas

un '\0' dans `buffer`, `recv()` se fou de savoir

si c'est du texte, binaire, ... il prend les données

présentent et met le tout dans ton tampon/buffer ...



int ret = recv( sock, buffer, 254, 0 );

if ( ret > 0 )

{

buffer[ret] = '\0';

cout << buffer << endl;

}

else cout << "erreur!!!" << endl;



mais si tu fais un `memset(buffer, 0, 255);` avant le recv() alors ca peu toujours aller ...



//


texte = "Connexion avec le Serveur OK !";

//

// tu devrais plutôt faire:

//

strcpy( texte,
"Connexion avec le Serveur OK !" );

//



tu as oublié tes `delete[]`:

delete [] texte; // serveur

delete [] buffer; // client



...




~(.:: NitRic ::.)~
3
cs_Matt67 Messages postés 549 Date d'inscription samedi 6 septembre 2003 Statut Membre Dernière intervention 6 mars 2010 3
25 avril 2005 à 20:54
Bonsoir,



Ca doit venir de cette ligne dans le client


recv(sock, buffer, strlen(buffer), 0);

essaie


recv(sock, buffer, 254, 0);

et je ferais un petit memset pour initialiser le buffer de reception.



Matt...
0
minet03 Messages postés 415 Date d'inscription samedi 4 janvier 2003 Statut Membre Dernière intervention 2 décembre 2005 3
25 avril 2005 à 21:11
pour pas d'eereur :

memset(buffer,0,sizeof(buffer));

recv(sock,buffer,sizeof(buffer),0);



strlen() retourne le nombre de caractère de ta chaine, donc 0. Mais là
puisqu'elle n'est pas initialisé strlen() retourne une valeur fausse.

sizeof() renvoi directement la taille alloué par ta variable.

Le CyberMonde nous offre une meilleur qualité de vie
CyberMan.inc The WebSite
0
cs_Matt67 Messages postés 549 Date d'inscription samedi 6 septembre 2003 Statut Membre Dernière intervention 6 mars 2010 3
25 avril 2005 à 21:28
bonsoir,



sizeof(buffer) va te renvoyer 4 et non la taille de ton buffer.


Matt...
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Sload Messages postés 23 Date d'inscription samedi 25 octobre 2003 Statut Membre Dernière intervention 21 juillet 2005
26 avril 2005 à 23:35
Merci à tous !
Avec vos conseils ca marche maintenant !
En effet en utilisant memtest ca fonctionne.
Merci à Nitrick pour ses remarques ! C vrai je code un peu a la bourrin ! Je debute faut dire !

Antoine
0
Rejoignez-nous