Probleme Serveur C++

Résolu
ipascual Messages postés 28 Date d'inscription samedi 29 avril 2006 Statut Membre Dernière intervention 15 janvier 2007 - 6 déc. 2006 à 19:19
racpp Messages postés 1909 Date d'inscription vendredi 18 juin 2004 Statut Modérateur Dernière intervention 14 novembre 2014 - 8 déc. 2006 à 00:42
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

racpp Messages postés 1909 Date d'inscription vendredi 18 juin 2004 Statut Modérateur Dernière intervention 14 novembre 2014 17
8 déc. 2006 à 00:05
C'est étrange. Essaie de faire:
recv(csock,buffer,1024,0);
3
racpp Messages postés 1909 Date d'inscription vendredi 18 juin 2004 Statut Modérateur Dernière intervention 14 novembre 2014 17
7 déc. 2006 à 01:16
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.
0
ipascual Messages postés 28 Date d'inscription samedi 29 avril 2006 Statut Membre Dernière intervention 15 janvier 2007
7 déc. 2006 à 17:11
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
0
racpp Messages postés 1909 Date d'inscription vendredi 18 juin 2004 Statut Modérateur Dernière intervention 14 novembre 2014 17
7 déc. 2006 à 18:24
Désolé il fallait faire char buffer[1024];
Car avec char* buffer[1024]; on déclare un tableau de pointeurs sur char.
0

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

Posez votre question
ipascual Messages postés 28 Date d'inscription samedi 29 avril 2006 Statut Membre Dernière intervention 15 janvier 2007
7 déc. 2006 à 21:32
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
0
racpp Messages postés 1909 Date d'inscription vendredi 18 juin 2004 Statut Modérateur Dernière intervention 14 novembre 2014 17
7 déc. 2006 à 22:30
Il faut montrer les bouts de codes (serveur et client) qui poseraient problème.
0
ipascual Messages postés 28 Date d'inscription samedi 29 avril 2006 Statut Membre Dernière intervention 15 janvier 2007
7 déc. 2006 à 22:40
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,
0
racpp Messages postés 1909 Date d'inscription vendredi 18 juin 2004 Statut Modérateur Dernière intervention 14 novembre 2014 17
7 déc. 2006 à 23:10
Le problème pourrait venir du client aussi. Montre le code autour de la fonction send().
0
ipascual Messages postés 28 Date d'inscription samedi 29 avril 2006 Statut Membre Dernière intervention 15 janvier 2007
7 déc. 2006 à 23:25
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
0
racpp Messages postés 1909 Date d'inscription vendredi 18 juin 2004 Statut Modérateur Dernière intervention 14 novembre 2014 17
7 déc. 2006 à 23:48
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?
0
ipascual Messages postés 28 Date d'inscription samedi 29 avril 2006 Statut Membre Dernière intervention 15 janvier 2007
7 déc. 2006 à 23:54
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
0
ipascual Messages postés 28 Date d'inscription samedi 29 avril 2006 Statut Membre Dernière intervention 15 janvier 2007
8 déc. 2006 à 00:19
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
0
racpp Messages postés 1909 Date d'inscription vendredi 18 juin 2004 Statut Modérateur Dernière intervention 14 novembre 2014 17
8 déc. 2006 à 00:40
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.
0
racpp Messages postés 1909 Date d'inscription vendredi 18 juin 2004 Statut Modérateur Dernière intervention 14 novembre 2014 17
8 déc. 2006 à 00:42
Pourquoi just 4?
C'est la taille d'un pointeur en 32 bits. Ce qui équivaut à 4 octets.
0
Rejoignez-nous