CLASSE WINSOCK POUR NEWBIE

cosmobob Messages postés 700 Date d'inscription mardi 30 décembre 2003 Statut Membre Dernière intervention 27 janvier 2009 - 20 juil. 2005 à 18:05
cs_jean84 Messages postés 449 Date d'inscription jeudi 26 août 2004 Statut Membre Dernière intervention 5 mars 2009 - 12 août 2006 à 19:13
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.

https://codes-sources.commentcamarche.net/source/32809-classe-winsock-pour-newbie

cs_jean84 Messages postés 449 Date d'inscription jeudi 26 août 2004 Statut Membre Dernière intervention 5 mars 2009
12 août 2006 à 19:13
Merci de ton encouragement :-)
Pour les pointeurs en fait, la classe n'a plus vraiment en rapport avec la premiere classe. Globalement, la premiere partie de ma classe renvoye tout simplement un pointeur de type SOCKET qu'on pouvait utiliser avec les fonctions de base a savoir send() et recv(). De l'eau a coule sous les ponts et la classe actuelle est vraiment tres differente de la premiere... au moins j'y ai appris enormement et je ne refais plus du tout (du moins j'essaye :p) les meme erreurs... (a part peut etre le contructeur de copie que je n'implemente pas toujours dans mon code ... mais bon, y a pire)

En tout cas merci a tous ceux qui se sont attarde 2 minutes sur mon code ^^

@++
PavICF Messages postés 17 Date d'inscription dimanche 8 août 2004 Statut Membre Dernière intervention 14 avril 2007
11 juil. 2006 à 23:16
C'est une bonne initiative cette classe, ça va éviter à pas mal de monde d'avoir à en écrire une pour une appli réseau plutôt simple.

Par contre, je ne voie vraiment pas pourquoi vous ne voulez pas de pointeurs dedans.... Franchement, cela accélère quand même l'exécution du code, surtout quand il s'agit de passer en paramètre des tableaux: cela évite la copie du tableau dans une zone mémoire temporaire effacée une fois la fonction exécutée.

De plus, étant donné qu'il s'agit ici d'une exécution linéaire, pas de risque que l'utilisateur modifie le tableau pendant l'exécution de la fonction. (je ne voie pas de thread alors...)

Alors c'est sûr qu'avec les pointeurs faut faire attention avec les constructeurs de recopie, mais bon, c'est pas insurmontable.

Bonne source en tous cas!
cs_jean84 Messages postés 449 Date d'inscription jeudi 26 août 2004 Statut Membre Dernière intervention 5 mars 2009
18 nov. 2005 à 14:20
ERREURS recevBuf(char *pRBuff, int sizeBuff);
Merci d'utiliser ma classe ;-)
SAKingdom Messages postés 3212 Date d'inscription lundi 7 novembre 2005 Statut Membre Dernière intervention 16 février 2009 15
14 nov. 2005 à 17:20
Pouvez vous me dire quelle est la fonction qui permet de recevoir les données envoyer par sendto dans ce code? (Je ne la connais probablement pas. C'est sûrement pour ça que je ne la trouve pas)
sheorogath Messages postés 2448 Date d'inscription samedi 21 février 2004 Statut Modérateur Dernière intervention 29 janvier 2010 17
12 oct. 2005 à 14:43
j'avais confondu lol
merci
++
cs_jean84 Messages postés 449 Date d'inscription jeudi 26 août 2004 Statut Membre Dernière intervention 5 mars 2009
12 oct. 2005 à 12:22
heu... faudra que tu me dises ou tu trouves des comparaisons de chaine de caracteres dans mon code .... peut etre le SENDFAILED, NOTDEFINE et autres mais c'est uniquement des defines.... attention a ne pas confondre !!
sheorogath Messages postés 2448 Date d'inscription samedi 21 février 2004 Statut Modérateur Dernière intervention 29 janvier 2010 17
11 oct. 2005 à 20:21
en c++ on peut comparer des chaine avec == ? il faut pas utiliser strcmp ?
cs_jean84 Messages postés 449 Date d'inscription jeudi 26 août 2004 Statut Membre Dernière intervention 5 mars 2009
11 oct. 2005 à 13:23
merci de ton message Arthiolis, je te donne sa de suite :

#include <stdio.h>
#include <windows.h>

int main (void)
{

U_INT port = 40000;
ERREURS er; // gestion avance des erreurs
bool result;
Reseau *r = NULL;
r = new Reseau(TCP, CLIENT, adresse, port); // regarde le source pour ça
result = etatConnexion();

if ( !result ){
printf("Erreur.\n");
system("pause");
return 0;
}

er = r->envoiBuf("coucou\0");

if ( er == NOTDEFINE ){
printf("Socket non-initialise.\n");
} else if ( er == DISCONNECT ){
printf("Connexion interrompue.\n");
} else if ( er == SENDFAILED ){
printf("Erreur pendant l'envoi.\n");
} else if ( er == OK ){
printf("Packet envoye.\n");
} else {
printf("Erreur interne.\n");
}

if ( r ){
delete r;
r = NULL;
}

return 0;
}

Voila a peu pres l'application typique de base de l'utilisation de ma classe... j'espere que tout est compris.

@++ tout le monde et bon code !
arthiolis Messages postés 4 Date d'inscription samedi 5 février 2005 Statut Membre Dernière intervention 8 octobre 2005
18 sept. 2005 à 18:56
j'adore cette source même si ce n'est qu'une bibliotheque ( ou classe c'est au choix).elle me parait bonne pour débuter en programmation réseau. seulement à partir de là il faut quand même arriver a comprendre comment fonctionne les fonctions , et pour un "newbie" comme moi c'est pas facile. est ce qu'il ne serait po possible d'avoir un petit bout de code, au moins pour un fonctionnement de base (connexion,arrêt,etc). Merci d'avance à l'auteur ou à d'autres personnes qui voudraient bien la publier avec cete source.
xterminhate Messages postés 371 Date d'inscription dimanche 4 janvier 2004 Statut Membre Dernière intervention 23 septembre 2009
24 août 2005 à 18:17
J'aime bien le Java, mais ma dernière appli mettait 30 secondes à réaliser une connexion.... jamais trouvé le probleme ! Cela dit, c'est plus simple en Java bien sur.
sheorogath Messages postés 2448 Date d'inscription samedi 21 février 2004 Statut Modérateur Dernière intervention 29 janvier 2010 17
24 août 2005 à 18:02
quitte a etre ...
sheorogath Messages postés 2448 Date d'inscription samedi 21 février 2004 Statut Modérateur Dernière intervention 29 janvier 2010 17
24 août 2005 à 18:01
qui a etre penible : ca serai bien de fournir un programme d'exemple qui utilise ta classe!!!
La programmation reseau en java est quand meme plus simple et moins sujette a erreur d'apres l'appercu que je vien d'avoir avec les commentaire !!!
bon continuation
++
xterminhate Messages postés 371 Date d'inscription dimanche 4 janvier 2004 Statut Membre Dernière intervention 23 septembre 2009
24 août 2005 à 13:35
L'exemple est pas clair sorti de son contexte.... mais globalement tu dois arriver à réduire le nombre de tests successifs.
xterminhate Messages postés 371 Date d'inscription dimanche 4 janvier 2004 Statut Membre Dernière intervention 23 septembre 2009
24 août 2005 à 13:32
Exemple :

if ( accuseEnvoi != SOCKET_ERROR )
return true;

peut s'écrire plus implement

return accuseEnvoi != SOCKET_ERROR ;
cs_jean84 Messages postés 449 Date d'inscription jeudi 26 août 2004 Statut Membre Dernière intervention 5 mars 2009
24 août 2005 à 12:25
j'y avais pa penser au constructeur... c'est vrai que sa seraui 100 fois plus pratiques .... merci pour l'idee ! je modifie tout ca et je le mets sur le site des que je peus.
Au fait pour bind(), j'ai toujours appris qu'il fallait le mettre... je savais pas que sa influencais sur le type de socket.... tu viens encore de m'en apprendre une ....
cs_jean84 Messages postés 449 Date d'inscription jeudi 26 août 2004 Statut Membre Dernière intervention 5 mars 2009
24 août 2005 à 12:00
oki je retravaille tout ca et je met a jour .... au fait pour le if ("true' ) return true; Tu le vois ou ?? et sinon par quoi tu le remplace ???
xterminhate Messages postés 371 Date d'inscription dimanche 4 janvier 2004 Statut Membre Dernière intervention 23 septembre 2009
19 août 2005 à 07:45
Globalement, vire tes fonctions init publiques et transforme les en constructeur. En POO, le constructeur sert à initialiser !
xterminhate Messages postés 371 Date d'inscription dimanche 4 janvier 2004 Statut Membre Dernière intervention 23 septembre 2009
19 août 2005 à 07:43
bind(s1,(SOCKADDR*)&sin,sizeof(sin)); dans InitTcpClient. Laisse l'OS le choix du socket client. Ca ne sert a rien de le fixer à la main... sinon à planter tes connexions.
xterminhate Messages postés 371 Date d'inscription dimanche 4 janvier 2004 Statut Membre Dernière intervention 23 septembre 2009
19 août 2005 à 07:40
Le code s'améliore par rapport à la dernière fois mais je vois encore plein de if( 'true' ) return true; Enlève les ! LA note augmente dans ma tete... je noterai lorsque tu auras fini. ;-)
xterminhate Messages postés 371 Date d'inscription dimanche 4 janvier 2004 Statut Membre Dernière intervention 23 septembre 2009
19 août 2005 à 07:38
initSocket = false; lorsque recv retourne -1 et 0.
cosmobob Messages postés 700 Date d'inscription mardi 30 décembre 2003 Statut Membre Dernière intervention 27 janvier 2009 4
18 août 2005 à 23:39
un buffer overflow c'est quand tu débordes d'un tableau.
si tu déclares un tableau char tableau[10], les indices valables vont de tableau[0] à tableau[9]. si tu fais tableau[10] = '\0', c'est un buffer overflow car tu écrases une zone mémoire qui n'est *pas* dans ton tableau (ca peut faire planter ton programme, changer le contenu d'une autre variable, etc. ce sont les pires erreurs du C).
avec ton ancien recv, si tu avais

char buffer[10];
recevBuf(buffer, sizeof(buffer));

tu pouvais écrire dans buffer[10] ce que tu dois a tout prix éviter !!!!!!! (rappel: recv(s, pRBuff, sizeBuff, 0) retourne soit -1 (SOCKET_ERROR) soit un nombre entre 0 et sizeBuff)

voila j'espere que t'as pigé.
il faut être très précautionneux avec ca, car les débogages avec ce genre de problèmes sont infernals !!! (va trouver d'ou ca vient si ton buffer overflow a pour effet de modifier une autre variable )
cs_jean84 Messages postés 449 Date d'inscription jeudi 26 août 2004 Statut Membre Dernière intervention 5 mars 2009
18 août 2005 à 19:00
j'ai mis a jour la source mais j'ai beau chercher je comprend pas ... :-(
Et sinon, a part sa, comme elle est ma source maintenant ?? j'ai modifier pas mal de trucs depuis le debut mine de rien...
cs_jean84 Messages postés 449 Date d'inscription jeudi 26 août 2004 Statut Membre Dernière intervention 5 mars 2009
18 août 2005 à 18:55
pourquoi un buffer oevrflow ?? je comprend pas trop ton derniere commentaire... je vois ce que j'ai oublier mais je vois pas en quoi il est illegal de faire pRBuff[accuseReception]... accuseReception donne bien le nombre de carcactere recu non ?? je suis dans le flou la..... HELP !
cosmobob Messages postés 700 Date d'inscription mardi 30 décembre 2003 Statut Membre Dernière intervention 27 janvier 2009 4
17 août 2005 à 23:05
salut,
t'as un probleme de buffer overflow, quand tu fais:
accuseReception = recv(s, pRBuff, sizeBuff, 0);
if ( (accuseReception != SOCKET_ERROR) && (accuseReception != 0) )
{
pRBuff[accuseReception] = '\0'

tu dois faire :
accuseReception = recv(s, pRBuff, sizeBuff-1, 0);

car si accuseReception vaut sizeBuff, il est illegal de faire
pRBuff[accuseReception] = '\0'

cf mon commentaire du 27/07/2005 à 15:28:26

a+
cs_jean84 Messages postés 449 Date d'inscription jeudi 26 août 2004 Statut Membre Dernière intervention 5 mars 2009
17 août 2005 à 16:33
Au fait, j'ai oublier un truc...
Maintenant ma classe gere l'UDP et les fonctions envoiBuf() et recvBuf() sont compatibles avec, ce qui n'allourdis pas trop le code. Donc j'espere que cette fois on pourras dire que ma classe est a peu pret complete pour l'utilisation de base du reseau sous windows....
@++
cs_jean84 Messages postés 449 Date d'inscription jeudi 26 août 2004 Statut Membre Dernière intervention 5 mars 2009
17 août 2005 à 16:04
Bon voila la mise a jour, comme d'hab' allez voir du cote du zip car l'affichage sur le site ne se fait pas exactement comme je le voudrais.... desole pour l'attente.
@++
cs_jean84 Messages postés 449 Date d'inscription jeudi 26 août 2004 Statut Membre Dernière intervention 5 mars 2009
29 juil. 2005 à 10:40
cyberp > moi j'ai jamais dit que sa servais a rien les pointeurs, au contraire, on me prend la tete sur ca depuis le debut parce que j'en ai mis et qu'apparament fallais pas.... et pour (initSocket == true), d'habitude je fais pas l'erreur... je vais modifier une derniere fois mon code et virer tous ces pointeurs. J'espere au moins arrete la polemique apres ca...

@++
xterminhate Messages postés 371 Date d'inscription dimanche 4 janvier 2004 Statut Membre Dernière intervention 23 septembre 2009
28 juil. 2005 à 22:29
Ca devient de pire en pire. Ton code risque de "segfaulter" à la première utilisation....

Au passage, NULL n'est pas du C++, mais du C. En C++, on choisi tout simplement 0.

Delete 0 ne fait 'pas de mal', alors if( s!=NULL) delete s, ne sert absolument à rien. Et surtout cela ne regle pas le probleme de copie. Si tu tiens au pointeur alors que tu ne comprends pas leur fonctionnement, je te recommande de chercher à "pointeur intelligent". Il existe quantité de classe dans STD et BOOST pour prendre en charge le pb de copie et de destruction.

Cordialement,
X.
CyberP Messages postés 283 Date d'inscription mercredi 8 janvier 2003 Statut Membre Dernière intervention 4 juillet 2007 2
28 juil. 2005 à 20:24
J'ai lu un peu tous vos trucs et je trouve que c'est idiot de ne pas utiliser les pointeurs... autant aller vers un autre langage alors, je ne vois pas l'intérêt du C/C++ s'il n'y pas de pointeurs... Bon effectivement les SOCKET ce n'est pas la peine de les mettre en pointeur puisqu'un SOCKET est tout simplement un nombre

Pour ton cleanWinsock, copies juste son contenu dans le destructeur ou si tu veux vraiment pas, mets le au moins en private.

Autre chose : quand tu écris "initSocket == true", tu peux le remplacer par "initSocket" tout simplement
Et "initSocket == false" s'écrit "!initSocket"
cs_jean84 Messages postés 449 Date d'inscription jeudi 26 août 2004 Statut Membre Dernière intervention 5 mars 2009
28 juil. 2005 à 17:08
Je sais pas ce qu'est BOOST::noncopyable (jamais entendu parler...). J'ai fini de reecrire ma classe avec un constructeur qui initialise s = NULL; et destructeur sa donne :
if ( initSocket == true )
{
closesocket(*s);
WSACleanup();
}
if ( s != NULL )
delete s;
J'ai egalement retravaille les fonctions recevBuff() et envoiBuff() en corrigeant les bugs.... Le seul probleme vient desormais de mon pc qui ne veut plus demarrer et donc pas moyen de recuperer les codes sources... :-(
Patience des que sa demarre, je met a jour le code (tout est pret y a pas de raison....)
xterminhate Messages postés 371 Date d'inscription dimanche 4 janvier 2004 Statut Membre Dernière intervention 23 septembre 2009
27 juil. 2005 à 22:55
Pour eviter ce genre de truc, comme tu dis, il faut simplifier ta classe et ne pas utiliser de variables membres pointées. En plus, tu peux faire hériter ta classe de BOOST::noncopyable puisque conceptuellement elle n'est pas copiable.

Cordialement,
x.
cs_jean84 Messages postés 449 Date d'inscription jeudi 26 août 2004 Statut Membre Dernière intervention 5 mars 2009
27 juil. 2005 à 19:07
deck_bsd > merci pour le site mais je connaissais deja (c'est d'ailleurs la dessus que j'ai appris en (grosse) partie l'utilisation des sockets...) mais c'est quand meme sympa de poster cette adresse pour ceux qui la connaisse pas, c'est vraiment un super tuto, il faut l'avouer !

cosmobob > la tu viens de m'en apprendre une.... sa resoudra pas mal de probleme dans l'avenir (tres) proche de mes progs.... je mets a jour le code des que je peut avec toutes les modifs. Au fait, t'en pense quoi de mon utilisation de mes pointeurs ?? Je trouvais sympa de n'utiliser qu'une variable pour socket et utiliser des pointeurs pour pouvoir la manipuler un peu partout, mais bon apprement, c'etait pas genial.... et derniere petite question, je peut utiliser cleanWinsock() dans le destructeur de ma classe Reseau ??(j'utilise pas beaucoup ce genre de truc mais sa a l'air interressant...)

Merci tout le monde et @++
deck_bsd Messages postés 1243 Date d'inscription jeudi 31 mars 2005 Statut Membre Dernière intervention 3 août 2016 2
27 juil. 2005 à 17:26
SAlut, voici un doc tres bien fait sur l'utilisation des socket.
Ca ne résoudra p-e pas votre problèmes mais c tjrs bien de jeter un coup d'oiel.

http://c.developpez.com/WalrusSock/
cosmobob Messages postés 700 Date d'inscription mardi 30 décembre 2003 Statut Membre Dernière intervention 27 janvier 2009 4
27 juil. 2005 à 15:28
ha ben tiens du coup, c'est pRBuff[r] = 0 qu'il faut mettre (et pas r-1) !!! sinon tu écrases le dernier caractere ...

bool Reseau::recevBuf(char *pRBuff, int size_buf)
{
if ( initSocket == true ) // on verifie si la connexiona ete initialise
{
int r = recv(*s, pRBuff, size_buff-1, 0)
if ( r != SOCKET_ERROR && r != 0) // si r = 0, il y a eu
une deconnexion
{
pRBuff[r] = 0; // place un caractere de fin de chaine
// pas de pb d'overflow car r <= size_buff-1
return true; // en cas de reussite, on renvoie true
}
}
return false; // si la conenxion n'a pas ete initlialise, on renvoie false
}

a+
cosmobob Messages postés 700 Date d'inscription mardi 30 décembre 2003 Statut Membre Dernière intervention 27 janvier 2009 4
27 juil. 2005 à 15:26
quand tu fais int r = recv() tu récuperes dans r la valeur de retour de recv.
quand tout se passe bien, il se trouve que recv retourne le nombre d'octets effectivement recu.
sinon, elle retourne 0 si le remote host s'est deconnecté et SOCKET_ERROR en cas d'erreur.

si tout s'est bien passé, les r premiers octets de ton buffer ont donc été rempli par recv. La il suffit de placer un 0 a la fin (le pRBuff[r-1]=0) pour pouvoir notamment afficher directement cette chaine a l'écran.
cs_jean84 Messages postés 449 Date d'inscription jeudi 26 août 2004 Statut Membre Dernière intervention 5 mars 2009
27 juil. 2005 à 11:39
Excuse cosmobob, j'avais pas fait gaff' pour l'exemple ( sizeof(buffer) ).... sorry :-)
cs_jean84 Messages postés 449 Date d'inscription jeudi 26 août 2004 Statut Membre Dernière intervention 5 mars 2009
27 juil. 2005 à 11:37
X > comment je fais pour eviter ce genre de truc ??? Je met la fonction cleanWinsock() dans le destructeur par default de ma classe ?? (c'est la seule soluce que je vois et je commence a comprendre pourquoi tu m'as dit qu'au final c'est penible... d'appeller un destructeur eplicitement...)
J'avais promis de mettre a jour la source hier soir, desole j'ai pas eu le temps j'essaye de le faire ce soir....
Au fait cosmobob > quand tu ecris
int r = recv(*s, pRBuff, size_buff-1, 0)
if ( r != SOCKET_ERROR && r != 0) // si r = 0, il y a eu
une deconnexion
{
pRBuff[r-1] = 0; // place un caractere de fin de chaine
return true; // en cas de reussite, on renvoie true
}
je comprend pas le int r = recv() ainsi que le pRBuff[r-1]...

Merci a vous deux pour vos conseils !
@++
cosmobob Messages postés 700 Date d'inscription mardi 30 décembre 2003 Statut Membre Dernière intervention 27 janvier 2009 4
26 juil. 2005 à 22:20
jean84> oui il est possible - et il faut - s'en servir comme ca (regarde la derniere ligne de mon commentaire precedent !!!!!)
sizeof va te donner la bonne taille pour un tableau si tu l'appelles AVANT de le passer en parametre a une autre fonction (car sinon, le tableau est implicitement converti en char*, et le sizeof ne vaut plus la meme chose)
normalement, pour un tableau quelconque:
int tab[500];
pour avoir 500, on doit faire sizeof(tab)/sizeof(tab[0]);
or, il se trouve que pour un tableau de char, sizeof(tab[0]) vaut 1 ...
xterminhate Messages postés 371 Date d'inscription dimanche 4 janvier 2004 Statut Membre Dernière intervention 23 septembre 2009
26 juil. 2005 à 18:20
Exemple à tester pour t'en convaicre:

Reseau R1;
R1.initConnexion(); // s initialisé
//...
Reseau R2 = R1; // s de R1 et s de R2 sont identiques
R2.cleanWinsock(); // s détruit
//...
R1.envoiBuf(...); // s invalide => "segfault"

A méditer sur l'interet des pointeurs dans ta classe.
cs_jean84 Messages postés 449 Date d'inscription jeudi 26 août 2004 Statut Membre Dernière intervention 5 mars 2009
26 juil. 2005 à 18:09
Pour delete c'est bon (regarde du cote de cleanWinsock()), j'ai compris le truc mais pour ce que tu m'as dit tout a l'heure (si l'utilisateur copie, assigner, detruit plusieurs instances, ...) j'avoue que j'ai pas de reponse..... et que je comprend pas trop ce que tu as voulu dire .....
xterminhate Messages postés 371 Date d'inscription dimanche 4 janvier 2004 Statut Membre Dernière intervention 23 septembre 2009
26 juil. 2005 à 17:18
Si tu persiste avec les pointeurs, n'oubli pas l'appel de delete pour chaque variable pointée (variables membres et instances dynamiques). Tu verras que l'appel explicite du destructeurs devient rapidement lourd...

Cordialement,
X.
xterminhate Messages postés 371 Date d'inscription dimanche 4 janvier 2004 Statut Membre Dernière intervention 23 septembre 2009
26 juil. 2005 à 17:16
Laisse tomber les pointeurs, ca ne t'apportera rien de bon. En fait, l'utilisation des pointeurs est vraiment necessaire dans tres peux de cas : API C (socket), polymorphisme, etc.

Sincèrement, dans tous les autres cas courant (ton cas), utilise de simples variables...
cs_jean84 Messages postés 449 Date d'inscription jeudi 26 août 2004 Statut Membre Dernière intervention 5 mars 2009
26 juil. 2005 à 17:09
Au fait pour ta question 2 cases au dessus, je n'en ai aucune idee..... :-(
cs_jean84 Messages postés 449 Date d'inscription jeudi 26 août 2004 Statut Membre Dernière intervention 5 mars 2009
26 juil. 2005 à 17:05
C'est vrai que j'ai commence la prog par le Java (mais j'ai tres vite arrete...). Pour mon code Reseau *client = new Reseau, n'est-ce pas une facon de creer un objet de maniere dynamique ?? De ce que je sais, il existe 2 facons d'instancier une classe : une dynamique et l'autre statique. Le resultat est sensiblement le meme a part que l'utilisation de l'objet se fait a travers un poonteur (donc on utilise "->" au lieu de "." pour acceder aux fonctions membres de cette meme classe). Si vraiment je me trompe royalement, faut me le dire parce que sincerement j'ai appris comme sa et j'ai vu pas mal de codes ainsi.....
xterminhate Messages postés 371 Date d'inscription dimanche 4 janvier 2004 Statut Membre Dernière intervention 23 septembre 2009
26 juil. 2005 à 16:47
Le dernier exemple de code que tu donnes me laisse penser que tu es un codeur Java, je me trompe ?

Reseau * client = new Reseau;

... peut s'ecrire plus simplement :

Reseau client;

Bizarre, ta façon de coder C++.

Cordailement,
X.
xterminhate Messages postés 371 Date d'inscription dimanche 4 janvier 2004 Statut Membre Dernière intervention 23 septembre 2009
26 juil. 2005 à 16:43
Non ce n'est pas plus propre. Je te donne une piste : que ce passe t il si l'utilisateur tente de copier, assigner, detruire une ou plusieurs instances de ta classe...

D'aillieurs, un débutant en C++ aura plus de faciliter à manipuler des variables (non pointées) ou des références.

Cordialement,
X.
cs_jean84 Messages postés 449 Date d'inscription jeudi 26 août 2004 Statut Membre Dernière intervention 5 mars 2009
26 juil. 2005 à 15:36
cosmobob > je voulais savoir un truc, quand tu me conseil de refaire la fonction recevBuff(char *pRBuff, int size_buff), est-il possible lors de l'appel de la fonction membre de passer par sizeof() pour obtenir le int size_buff ??

exemple :

char buffer[100+1];
Reseau *client = new Reseau;
client->recevBuff(buffer, sizeof(buffer));


ensuite pour xterminhate >
quand tu me dis que l'utilisation de pointeurs sur mes fonctions membres entraine des problemes que je semble ignore, sa serait sympa de preciser quelles genres de problemes je tend a rencontrer ; sa m'aiderais car j'aime bien utilise des pointeurs avec mes fonctions, je trouve sa plus propre.... (ce n'est evidement que mon avis)

@++
cs_jean84 Messages postés 449 Date d'inscription jeudi 26 août 2004 Statut Membre Dernière intervention 5 mars 2009
26 juil. 2005 à 15:15
Merci a vous tous pour vos conseils, je vais tacher d'en tirer profit... Je remet a jour ma source des que j'ai modifier tous les petits details que vous m'avez signaler... Merci encore a tous pour votre gentillesse !!
@++
cosmobob Messages postés 700 Date d'inscription mardi 30 décembre 2003 Statut Membre Dernière intervention 27 janvier 2009 4
22 juil. 2005 à 15:16
salut,
tes fonctions d'envoi et de reception sont boguées. Tu crois que sizeof est capable de connaitre la taille d'un tableau a l'execution ce qui n'est pas le cas.
quand tu fais:
if ( (send(*s, pSBuff, sizeof(pSBuff), 0)) != SOCKET_ERROR )
sizeof(pSBuff) vaut TOUJOURS 4 (c-a-d la taille d'un char*, qui comme tous les pointeurs est codé sur 4 octets).
si tu veux connaitre la taille de la chaine de caractere, c'est strlen qu'il faut employer.

le cas de la fonction de reception est un autre exemple:
tu dois passer en parametre de la fonction la taille du buffer (car ton sizeof trouvera toujours 4, meme si c'est un buffer de 1 octet (ce qui sera genant) ou un buffer de 100 octets)

bool Reseau::recevBuf(char *pRBuff, int size_buf)
{
if ( initSocket == true ) // on verifie si la connexiona ete initialise
{
int r = recv(*s, pRBuff, size_buff-1, 0)
if ( r != SOCKET_ERROR && r != 0) // si r = 0, il y a eu
une deconnexion
{
pRBuff[r-1] = 0; // place un caractere de fin de chaine
return true; // en cas de reussite, on renvoie true
}
}
return false; // si la conenxion n'a pas ete initlialise, on renvoie false
}

et on s'en sert comme ca:

char buffer[400];
Reseau client;
...
client.recevBuf(buffer, sizeof(buffer));
xterminhate Messages postés 371 Date d'inscription dimanche 4 janvier 2004 Statut Membre Dernière intervention 23 septembre 2009
22 juil. 2005 à 12:15
Enfin, l'utilisation que tu fais des pointeurs induit un certain nombre de problemes que tu semble ignorer. La meilleure solution consisterait à ne pas utiliser des pointeurs : un membre s de type SOCKET devrait suffir amplement (en remplacement de SOCKET * s).

Cordialement,
X.
xterminhate Messages postés 371 Date d'inscription dimanche 4 janvier 2004 Statut Membre Dernière intervention 23 septembre 2009
22 juil. 2005 à 12:09
Bonjour,

Tu sembles mélanger un peu les structures de contrôle du langage. Voici quelques conseils pour clarifier ton code :

1) Premier exemple :
if(<condition>)
return true;
else
return false;

... peut s'écrire plus simplement :
return (<condition>)

2) Exemple suivant :
if(<condition>)
return s1;
else
return s1;

... peut s'écrire plus simplement;
<condition>;
return s1;

3) Dernier exemple :
switch(<condition>)
{
case true :

break;

break;
default;

}

... peut s'écrire plus simplement :
if(<condition>)

else


Tu devrais divisier par deux ou trois le nombre de ligne de code et améliorer la lisibilité et l'efficacité.

Cordialement,
X.
cs_jean84 Messages postés 449 Date d'inscription jeudi 26 août 2004 Statut Membre Dernière intervention 5 mars 2009
21 juil. 2005 à 11:41
Je suis ravie que tu es aime. Ca me fait extrement plaisir.... :-) Reste dans le coin, j'ai une mise jour qui devrait etre encore plus simple (j'ai suivi les conseils de cosmobob) et je pense le mettre a jour cet aprem...
@++
gpettier Messages postés 26 Date d'inscription vendredi 24 septembre 2004 Statut Membre Dernière intervention 1 décembre 2006
21 juil. 2005 à 10:39
c'est cool justement je débute sur le reseau et je comprend pas encore tout mais winsock est pratique c'est vrai!
merci
cs_jean84 Messages postés 449 Date d'inscription jeudi 26 août 2004 Statut Membre Dernière intervention 5 mars 2009
20 juil. 2005 à 18:49
oki c 'est cool ... je vais travailler tout ça... le but c'etait uniquement d'arriver a obtenir une socket en ne pensant plus a tout ce qui faut coder avant mais en voyant les codes que tu m'as presente je vais la completer avec peut etre une socket pour sniffer... mais bon sa sera en dehors des noobs.... je te remercie de tes conseils.
@ ++
cosmobob Messages postés 700 Date d'inscription mardi 30 décembre 2003 Statut Membre Dernière intervention 27 janvier 2009 4
20 juil. 2005 à 18:05
salut,
c'est pas mal pour un début, mais ta classe est incomplete, tu aurais pu fournir une interface avec un Send, SendLine, Recv, RecvLine, etc..., en encapsulant absolument tout.
ca aurait encore été mieux pour les nioub !!
cf http://www.cppfrance.com/code.aspx?id=23432
ou bien http://www.cppfrance.com/code.aspx?id=20546

a+