[SOCKET]Tjrs le pb de recuperation du buffer recv()

enthaz Messages postés 13 Date d'inscription samedi 26 juillet 2003 Statut Membre Dernière intervention 27 août 2003 - 23 août 2003 à 19:30
enthaz Messages postés 13 Date d'inscription samedi 26 juillet 2003 Statut Membre Dernière intervention 27 août 2003 - 27 août 2003 à 21:10
Allez J me lance : ca fait des heures et des heures ke le newb ke je suischerche la solution :
D un coté j ai un logiciel client ki envoie "coucou" sur le port d une machine sur un port determiné.
D un autre coté un serveur qui ecoute sur le mm port en tente ( desesperement d afficher ce k il recoit.
Or il affiche n importe koi ac en plus -1 pr le resultat de recv().
Je c ke ce prob en revenu svt sur le forum mais apres des recherches je n ai pas trouV de solutions convaincante. Votre solution servira dc d autres codeurs. Merci d avance pr vos reponses, je vs donne les codes sources :

---------------------------------------------------------------------- Partie serveur
----------------------------------------------------------------------

#include "stdafx.h"
#include <stdlib.h>
#include
#include <winsock2.h>

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

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

WSADATA WSAData;
WSAStartup(MAKEWORD(2,0), &WSAData);
SOCKET sock;
SOCKADDR_IN sin;

char buffer[64]; /* le buffer */

sock = socket(AF_INET, SOCK_STREAM, 0); /* le sock */
sin.sin_addr.s_addr= INADDR_ANY;
sin.sin_family= AF_INET;
sin.sin_port= htons(1105);
if(bind(sock, (SOCKADDR *)&sin, sizeof(sin)) == -1)

{
cout<<"erreur du bind"; /* erreur */
}
if(listen(sock, 0) == -1)
{
cout<<"erreur du listen"; /* erreur */
}

int sinsize = sizeof(sin);

if(accept(sock, (SOCKADDR *)&sin, &sinsize) == -1)
{
cout << "erreur du accept";
}
int fd;
fd = recv(sock, buffer, sizeof(buffer), 0); /* dc la je recoit*/

cout<<"\n"<
#include <winsock2.h>

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

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

WSADATA WSAData;
WSAStartup(MAKEWORD(2,0), &WSAData);
SOCKET sock;
SOCKADDR_IN sin;

/* Tout est configuré pour se connecter sur IRC, haarlem, Undernet. */
sock = socket(AF_INET, SOCK_STREAM, 0);
sin.sin_addr.s_addr= inet_addr("IP à modifier");
sin.sin_family= AF_INET;
sin.sin_port= htons(1105);
if(connect(sock, (SOCKADDR *)&sin, sizeof(sin)) == -1)
{
cout << "erreur du connect "; /* erreur */
}
if(send(sock, "coucou", 6, 0) == -1) /* on envoie */
{
cout << "erreur du send"; /* erreur */
}

closesocket(sock);
WSACleanup(); /* on ferme tt ca */

int i;
cin>>i; /* pr avoir le tps de lire les erreurs */

return 0;
}

---------------------------------------------------------------------

Bon ben voila
Merci pr votre aide.
A bientot !

21 réponses

Anacr0x Messages postés 515 Date d'inscription dimanche 25 mai 2003 Statut Membre Dernière intervention 27 avril 2006 2
24 août 2003 à 00:11
G vraiment pas le temps de regardé le code en détail la mais sincerement, au lieu de te faire ***** a crée ca, je te conseille de regardé la source [1875 http://www.cppfrance.com/article.aspx?ID=1875], tu vera, c bien fait, largement suffisant ds la plupart des cas et assez pratique (^_^)
0
enthaz Messages postés 13 Date d'inscription samedi 26 juillet 2003 Statut Membre Dernière intervention 27 août 2003
24 août 2003 à 00:33
Oups j ai oublié de preciser que je suis sur windows alors je c pas l article ke tu m as dit est pr linux je v voir ...

Enthaz
0
Anacr0x Messages postés 515 Date d'inscription dimanche 25 mai 2003 Statut Membre Dernière intervention 27 avril 2006 2
24 août 2003 à 14:14
Pour linux ? On parle bien de la meme source la ?
Tu n'as qu'as inclure bubsock.h ds ton projet et ensuite ta déja dé exemple, de plus, ca marche très bien sous windows, g déja testé...
0
Anacr0x Messages postés 515 Date d'inscription dimanche 25 mai 2003 Statut Membre Dernière intervention 27 avril 2006 2
24 août 2003 à 14:16
euh en fait, fo pas cliké sur mon lien, il é foireux... va simplement sur http://www.cppfrance.com/article.aspx?ID=1875
0

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

Posez votre question
enthaz Messages postés 13 Date d'inscription samedi 26 juillet 2003 Statut Membre Dernière intervention 27 août 2003
24 août 2003 à 15:01
MERCI !!!!!!!!!!!!
Ca m a vraiment aidé les sockets sont bien plus facile maintenan.
merci
0
Anacr0x Messages postés 515 Date d'inscription dimanche 25 mai 2003 Statut Membre Dernière intervention 27 avril 2006 2
24 août 2003 à 15:04
de rien, moi aussi g un peu galéré avec ca au début (^_^)
0
cs_aardman Messages postés 1905 Date d'inscription mercredi 22 janvier 2003 Statut Membre Dernière intervention 17 septembre 2012 3
24 août 2003 à 15:41
Salut,
Tu ne peut pas recevoir des infos a partir d'un socket qui ecoute.
Dans ton serveur en haut tu met SOCKET sclient;
et quand tu accepte la connexion tu met sclient = accept(sock, (SOCKADDR *)&sin, &sinsize)

Et tu appelles recv(...) avec sclient.
Et ca marche.
0
enthaz Messages postés 13 Date d'inscription samedi 26 juillet 2003 Statut Membre Dernière intervention 27 août 2003
25 août 2003 à 21:37
Est ce qu il faut mettre ca ds le serveur et ds le client ou juste le serveur?Et est ce qu il fo definir un SOCKADDR_IN pr le socket ke tu m a dit de rajouter? Merci bcp
0
cs_aardman Messages postés 1905 Date d'inscription mercredi 22 janvier 2003 Statut Membre Dernière intervention 17 septembre 2012 3
25 août 2003 à 21:50
Salut,
Ben puisque c'est la ligne avec accept(..) qui merde, c'est forcément dans le serveur.
accept(...) retourne un socket handle, ce nouveau socket handle identifie la connexion acec le client qui vient de se connecter. L'ancien socket lui, continue a ecouter sur le port donné.
0
enthaz Messages postés 13 Date d'inscription samedi 26 juillet 2003 Statut Membre Dernière intervention 27 août 2003
27 août 2003 à 12:56
Deja merci pour ton aide .
Ca marche deja mieux avec tes conseils mais c pas parfait :
J essaye d envoyer "Hello World!" ac le client mais je ne recoit que "Hell" . C est fort embetant et si t avai une idee. Le buffer est defini ds le serveur en new char[255]
Si t as besoin du nv code source dis le moi.
Merci

Enthaz
0
cs_aardman Messages postés 1905 Date d'inscription mercredi 22 janvier 2003 Statut Membre Dernière intervention 17 septembre 2012 3
27 août 2003 à 13:05
Salut,
L'erreur doit etre dans le recv(...) au niveau du 3eme argument. Il faut y mettre la taille du buffer que tu passe en 2eme argument, soit sizeof(buffer).
Si tu ne recois que Hell c'est que tu as du passer un truc qui retourne 4.
Si c'est pas ca, poste le code.
0
enthaz Messages postés 13 Date d'inscription samedi 26 juillet 2003 Statut Membre Dernière intervention 27 août 2003
27 août 2003 à 13:19
Je recoit exactement "Hell=======================================================================================²²²²"
Ss quoi j ai bien mis sizeof.Je te passe les codes mais je suis pas la cet aprem dc je regarderai ce soir. Merci encore de m aider c sympa.

------------------------------------------------------------------
Serveur
------------------------------------------------------------------

#include "stdafx.h"
#include <winsock2.h>
#include
#pragma comment(lib, "ws2_32.lib")

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

WSADATA WSAData;
WSAStartup(MAKEWORD(2,0), &WSAData);
SOCKET sock;
SOCKET csock;
SOCKADDR_IN sin;
SOCKADDR_IN csin;

char *buffer = new char[255];

sock = socket(AF_INET, SOCK_STREAM, 0);
sin.sin_addr.s_addr= INADDR_ANY;
sin.sin_family= AF_INET;
sin.sin_port= htons(1105);
bind(sock, (SOCKADDR *)&sin, sizeof(sin));
listen(sock, 0);

int sinsize = sizeof(sin);
if((csock = accept(sock, (SOCKADDR *)&sin, &sinsize)) != INVALID_SOCKET)
{
int fd = recv(csock, buffer, sizeof(buffer), 0);
cout << buffer << "\n de taille \n" << fd;
}

int i;
cin>> i;

return 0;
}

-------------------------------------------------------------------
Client
-------------------------------------------------------------------

#include "stdafx.h"
#include <winsock2.h>
#include
#pragma comment(lib, "ws2_32.lib")
void main()
{
WSADATA WSAData;
WSAStartup(MAKEWORD(2,0), &WSAData);

SOCKET sock;
SOCKADDR_IN sin;

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(1105);

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

if(send(sock, "Hello world!", sizeof("Hello world!"), 0) == -1)
{
cout <<"erreur send";
}

int i;
cin>>i;

}

---------------------------------------------------------------------
Merci !!!!!!!!!
Enthaz
0
cs_aardman Messages postés 1905 Date d'inscription mercredi 22 janvier 2003 Statut Membre Dernière intervention 17 septembre 2012 3
27 août 2003 à 13:32
Salut,
sizeof(buffer) retourne 4.
Normal quand on veut faire des alloc bizzares alors que c'est inutile.
Remplace char *buffer = new char[255];
par char buffer[256];

Aussi, quand tu envoies une chaine de caractere, il faut passer la longueur de la chaine au 3eme argument de send(..), pas la longueur du buffer, donc il faut mettre strlen("Hello world!"); dans ton client.
0
enthaz Messages postés 13 Date d'inscription samedi 26 juillet 2003 Statut Membre Dernière intervention 27 août 2003
27 août 2003 à 19:15
Alors maintenant je recoit bien la chaine en entier.J ai mm fait un stricmp pr verifier ce que recevait le serveur pask il reste un petit probleme : a l affichage y a toute une floppee de caractere bizarres apres ma chaine.
Mais bon le principal c ke je puisse traiter la chaine en dehors de l affichage.Mais si t azs une idee ... Merci
Enthaz
0
enthaz Messages postés 13 Date d'inscription samedi 26 juillet 2003 Statut Membre Dernière intervention 27 août 2003
27 août 2003 à 19:27
Rectification le stricmp ne marche po :'(
0
cs_aardman Messages postés 1905 Date d'inscription mercredi 22 janvier 2003 Statut Membre Dernière intervention 17 septembre 2012 3
27 août 2003 à 19:30
Salut,
Tu as essayé d'envoyer strlen(buffer) octets seulement, comme je t'ai dis dans le post d'avant ?
strlen(..) inclus le caractere final NULL, donc il ne devrait pas y avoir de probleme d'affichage, puisque tu recois la chaine telle qu'elle a été envoyée.
0
enthaz Messages postés 13 Date d'inscription samedi 26 juillet 2003 Statut Membre Dernière intervention 27 août 2003
27 août 2003 à 19:39
Salut

oui j ai bien mis le strlen mais le test ne marche po et l affichage non plus.Par contre le recv renvoie le bon nombre de caractere reçus !!
merci
Enthaz
0
cs_aardman Messages postés 1905 Date d'inscription mercredi 22 janvier 2003 Statut Membre Dernière intervention 17 septembre 2012 3
27 août 2003 à 19:51
Salut,
Et bien si tu recois le bon nombre de caractere (nbre de lettres de la chaine+1) c'est que l'erreur est autre part puisque la chaine que tu recois est identique a celle que tu envoies.
0
enthaz Messages postés 13 Date d'inscription samedi 26 juillet 2003 Statut Membre Dernière intervention 27 août 2003
27 août 2003 à 20:04
oups j avais oublier le 0 dc il me renvoi pas longueur+1.je c pas ... Si ca t embete laisse tomber c pas grave merci
(je v manger pe pas te repndre tt de suite)
Enthaz
0
cs_aardman Messages postés 1905 Date d'inscription mercredi 22 janvier 2003 Statut Membre Dernière intervention 17 septembre 2012 3
27 août 2003 à 20:15
Salut,
Dans ce cas rajoute le a la fin de la chaine que tu as recu, comme ca on est sur qu'il existe.
apres recv(...):
buffer[fd] = 0;

j'ai testé chez moi ca marche nickel.
0
Rejoignez-nous