Probleme Serveur C++ [Résolu]

Signaler
Messages postés
28
Date d'inscription
samedi 29 avril 2006
Statut
Membre
Dernière intervention
15 janvier 2007
-
Messages postés
1910
Date d'inscription
vendredi 18 juin 2004
Statut
Modérateur
Dernière intervention
14 novembre 2014
-
Bonjour a tous,

Je suis en train de faire un serveur en C++, qui marche. Je l`ai deja teste, et tout, el en generale il n`y a pas de problemes...L`unique probleme que j`arrive pas a comprendre c`est pourquoi la taille maximale de caracteres reçus ou envoyés, sont au max. 4. C`est a dire, si le client envoye la phrase "Bonjour le monde", le serveur reçoit toute la phrase, mais en plusieurs phases :
Bonj
our
le m
onde

Le probleme devient plus grave, quand c`est le serveur qui doiti envoyer des messages, car il envoye que 4 caracteres...Exemple:
Bonjour le monde!!

String envoyé: Bonj

Je suis sur et certain que le probleme vient du serveur, mais j`arrive pas a trouver la modif a faire, pour amplier le nomre de caracteres a envoyer\recevoir.

Pourriez vous m`aider?

Merci d`avance,

Ignasi

Voici un extrait du code pour le serveur:

Initialisation:
----
    sock = socket(AF_INET, SOCK_STREAM,0);
           
            sin.sin_addr.s_addr            = INADDR_ANY;
            sin.sin_family                = AF_INET;
            sin.sin_port                = htons(667);
            bind(sock, (SOCKADDR *)&sin, sizeof(sin));
            listen(sock,0);
           
            int sinsize = sizeof(csin);

Accepter socket
------------------

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

et la partie qui ecoute le message en entree:

int rv=recv(csock,buffer,sizeof(buffer),0);   

Je le poste pour que vous voyez quel type de fonction j`utilise pour etablir la connexion....

14 réponses

Messages postés
1910
Date d'inscription
vendredi 18 juin 2004
Statut
Modérateur
Dernière intervention
14 novembre 2014
13
C'est étrange. Essaie de faire:
recv(csock,buffer,1024,0);
Messages postés
1910
Date d'inscription
vendredi 18 juin 2004
Statut
Modérateur
Dernière intervention
14 novembre 2014
13
Salut,
Il faut voir la déclaration de ton buffer.
Si tu fais: char* buffer; la taille de buffer sera toujours 4 puisque c'est un pointeur.
Par contre si tu fais char* buffer[1024]; la taille sera bien 1024.
Messages postés
28
Date d'inscription
samedi 29 avril 2006
Statut
Membre
Dernière intervention
15 janvier 2007

Bonjour,

Je suis d`acord que le probleme peut venir du buffer. Par contre, j`arrive pas a reussir a faire char *buffer[1024], car le compilateur me donne un erreur:

"     error C2664: 'recv' : cannot convert parameter 2 from 'char *[]' to 'char *' "

avec recv:
                       int rv=recv(csock,buffer,sizeof(buffer),0);

Merci d`avance
Messages postés
1910
Date d'inscription
vendredi 18 juin 2004
Statut
Modérateur
Dernière intervention
14 novembre 2014
13
Désolé il fallait faire char buffer[1024];
Car avec char* buffer[1024]; on déclare un tableau de pointeurs sur char.
Messages postés
28
Date d'inscription
samedi 29 avril 2006
Statut
Membre
Dernière intervention
15 janvier 2007

Bonjour ,

En fait, j`ai essayé de faire ta modification. J`arrive a compiler sans erreurs , mais j`ai toujours le probleme de reception. Ma longueur maximale est de 4...Est-ce que je peux modifier d`autres parametres?

Merci beaucoup d`avance ,

Ignasi
Messages postés
1910
Date d'inscription
vendredi 18 juin 2004
Statut
Modérateur
Dernière intervention
14 novembre 2014
13
Il faut montrer les bouts de codes (serveur et client) qui poseraient problème.
Messages postés
28
Date d'inscription
samedi 29 avril 2006
Statut
Membre
Dernière intervention
15 janvier 2007

Bonjour,
Le bout de code:

 char inter[1024]
char buffer[1024]
int rv=recv(csock,buffer,sizeof(buffer),0);   

buffer[rv]=0; //pour clore la chaine de caractere               
                                                                   
strcpy(inter,buffer);

printf("Nous avons recu %s \n",inter);

voilu voila.....merci beaucoup. C`est just le serveur en C++ qui pose des problemes...Merci d`avance,
Messages postés
1910
Date d'inscription
vendredi 18 juin 2004
Statut
Modérateur
Dernière intervention
14 novembre 2014
13
Le problème pourrait venir du client aussi. Montre le code autour de la fonction send().
Messages postés
28
Date d'inscription
samedi 29 avril 2006
Statut
Membre
Dernière intervention
15 janvier 2007

Ok. J`ai cree deux Clients, un client en C++ et un autre en Java. A niveau de connexions il y a pas de problemes, mais j`insiste, il coupe les messages de 4 en 4..(Bonjour le monde...)
Bonj
our
le m
onde

Le client C++:

char buffer[1024];
cin>>buffer;
send(sock,buffer,sizeof(buffer),0);

Le client en Java :
        out=new BufferedWriter(new OutputStreamWriter(sock.getOutputStream()));
        out.write("Bonjour le monde");
        out.flush();

Le serveur reçoit le message comme ça
Bonj (premier tour de boucle...
our   (deuxieme tour de boucle...
le m  (trosieme..
onde (quatrieme...

Merci d`avance
Messages postés
1910
Date d'inscription
vendredi 18 juin 2004
Statut
Modérateur
Dernière intervention
14 novembre 2014
13
Dans ton client C++, send() va envoyer 1024 octets au serveur. Normalement, il ne faut envoyer que la chaine de caractères. Donc:
send(sock,buffer,strlen(buffer)+1,0);

Tu utilises quel compilateur?
Messages postés
28
Date d'inscription
samedi 29 avril 2006
Statut
Membre
Dernière intervention
15 janvier 2007

J`utilise Visual C++ 6.0.

En fait, le client en C++ je l`ai fait just pour tester avec une premiere approche le serveur en C++. Par la suite, ce qui m`interesse c`est le client java, qui lui envoye les chaines comme il faut. L`unique probleme que j`ai c`est que les chaines arrivent par morceaux. Je pense que c`est le but de code du serveur qui coince, car quand j`essaie d `envoyer des chaines  du serveur C++ au client (C++ ou Java) Il y a que 4 caracteres qui sont envoyes. Quand on fait l`inverse, toute la chaine est envoye, mais recue par morceaux....
c`est ceci que je ne comprends pas...

Merci d`avance,

Ignasi
Messages postés
28
Date d'inscription
samedi 29 avril 2006
Statut
Membre
Dernière intervention
15 janvier 2007

Bonjour,

En effet cela ça marche . Merci beaucoup. Mais il y  a une chose que j`arrive pas a comprendre....pourquoi sizeof(buffer) ne marcheait pas? Pourquoi just 4?  Encore merci, pour m`aider avec mon probleme. Meme si c`est resolu...j `aimerais comprendre pour quoi il marchait pas...

Merci et Merci :D
Messages postés
1910
Date d'inscription
vendredi 18 juin 2004
Statut
Modérateur
Dernière intervention
14 novembre 2014
13
sizeof() est utilisée par le compilateur pour déterminer le nombre d'octets occupés par une structure ou un tableau. Ce nombre sera écrit en dur dans l'exécutable. C'est à dire par exemple que sizeof(buffer) sera remplacé par 1024 dans le code de l'exécutable. Je n'avais jamais rencontré de problème de ce genre avec sizeof() avec VC6. Je viens d'ailleurs de faire un test:
char buffer[1024];
if(sizeof(buffer)==1024) MessageBox(0,"Test réussi","Test",0);
Le messagebox a été bien affiché prouvant que sizeof(buffer) a été bien remplacé par la valeur 1024.
Je pense toujours que l'erreur venait de ton code. Si ton compilateur ne réussit pas ce test, ça veut dire qu'il a un problème. Ce qui est très peu probable.
Messages postés
1910
Date d'inscription
vendredi 18 juin 2004
Statut
Modérateur
Dernière intervention
14 novembre 2014
13
Pourquoi just 4?
C'est la taille d'un pointeur en 32 bits. Ce qui équivaut à 4 octets.