LIBRAIRIE MANIPULANT LES SOCKET

cs_Kirua Messages postés 3006 Date d'inscription dimanche 14 avril 2002 Statut Membre Dernière intervention 31 décembre 2008 - 4 sept. 2004 à 00:59
NitRic Messages postés 402 Date d'inscription mardi 1 mai 2001 Statut Membre Dernière intervention 15 août 2011 - 5 sept. 2004 à 22:57
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/25920-librairie-manipulant-les-socket

NitRic Messages postés 402 Date d'inscription mardi 1 mai 2001 Statut Membre Dernière intervention 15 août 2011
5 sept. 2004 à 22:57
Oui, le temp d'exécution est très rapide pour tes checksums.


Tout à fait, ce n'est pas la peine de rendre la main, même quand tu rempli ton `tampon` de 65ko

l'utilisateur n'aura même pas le temp de s'en rendre compte que ca va être terminé

char * fill_buf( char * buf, size_t bufsize, char * str ) {

char * b = buf, * s;

while ( bufsize ) {
s = str;
while ( *s && bufsize-- ) *b++ = *s++;
}

return buf;

}

passe lui un `tampon` de 65ko ou même 128ko/256ko/... et tu vas voir à quel vitesse il rempli le `tampon` :)


Exact, tu charge à chaque `trame`. Charge au lancement du soft et décharge à la fermeture du soft << méthode parfaite(dans la plus part des cas tel que le tient)



~(.:: NitRic ::.)~


PS: Le code plus haut n'est pas parfait, ce n'est qu'un exemple.
_sebf Messages postés 42 Date d'inscription jeudi 1 avril 2004 Statut Membre Dernière intervention 7 octobre 2006
5 sept. 2004 à 22:23
> J'ai pas dis que `calcul_du_checksum()` était inutile/nuisible, j'ai dis que
> l'appel à `liberation_du_jeton()` était inutile et même nuisible dans
> `calcul_du_checksum()`

Tu veux dire que le temps du calcul est télément faible que ce n'est pas la peine de rendre la main ?

Quid du temps de calcul sur des datas de 65K.

> Tes boucles n'ont rien d'inquitant, aucun besoin de rendre la main à
> personne. Tu boucle et une fois terminé tu `return`

Ha oui, tu as raison :)

> Slee(0L); agit au niveau du thread appellant seulement, il agit un peu comme
> un DoEvents(vb) d'une certaine facon mais suspend l'exécution du thread un
> peu moin longtemp qu'un DoEvents(vb) et il n'est pas plus lent que ton
> `liberation_du_jeton()`, je dirais même qu'il serait plus rapide

Merci pour l'info

> Des algos(tes checksums) ca ce veut rapide et non ralentis par des `pseudos
> DoEvents` à la VB

J'ai compris. C'est vrai cas l'origine, cette fonction était là pour la boucle d'envoi de trame à l'infinie. Et j'ai débordé en en mettant partout.

> Une fois WSAStartup() appelé, la librarie est prete à être utilisé, la
> librairie est chargé dans le process appellant et comme dans ton code tu n'a
> qu'un seul et unique process, il serait préférable de charger la librairie
> qu'une seul fois, ton code serait plus `claire`, rapide, ...

Tu veux dire que je l'ouvre pour chaque trame ? Ha oui, surement. Merci pour la remarque.

> WSAStartup() charge la version qu'elle veut; Si la version que tu demande
> est disponible alors elle va la charger, sinon, elle va charger celle
> disponible sur le système.
>
> Imagine que tu demande la version 3 et que cette version n'est pas
> disponible, seul la version 2 est dispo, tes fonctions qui requier les
> nouveautés dans la version 3 vont planter, bugger, ...

Ok

> Bref, voilà .. c'était mes p'tits commentaires ...

Come dans mon précédent post, merci c'est sympas.

_SebF

http://www.frameip.com
Un site pour les spécialistes IP
NitRic Messages postés 402 Date d'inscription mardi 1 mai 2001 Statut Membre Dernière intervention 15 août 2011
5 sept. 2004 à 21:06
J'ai pas dis que `calcul_du_checksum()` était inutile/nuisible, j'ai dis que l'appel à `liberation_du_jeton()` était inutile et même nuisible dans `calcul_du_checksum()`

Tes boucles n'ont rien d'inquitant, aucun besoin de rendre la main à personne. Tu boucle et une fois terminé tu `return`

Slee(0L); agit au niveau du thread appellant seulement, il agit un peu comme un DoEvents(vb) d'une certaine facon mais suspend l'exécution du thread un peu moin longtemp qu'un DoEvents(vb) et il n'est pas plus lent que ton `liberation_du_jeton()`, je dirais même qu'il serait plus rapide

Des algos(tes checksums) ca ce veut rapide et non ralentis par des `pseudos DoEvents` à la VB

Pour la librarie Winsock, si tu dev une application cliente ou serveur ou autre qui requier les sockets(ainsi que la librairie Winsock), charge la librairie au lancement de ton application et tu la décharge une fois qu'elle n'est plus utile(à la fermeture de ton application ou autre par exemple)

Une fois WSAStartup() appelé, la librarie est prete à être utilisé, la librairie est chargé dans le process appellant et comme dans ton code tu n'a qu'un seul et unique process, il serait préférable de charger la librairie qu'une seul fois, ton code serait plus `claire`, rapide, ...


#include <winsock2.h>
#include <windows.h>
#include <stdio.h>
/* #include ... */

#define _WINSCK_VER (MAKEWORD(2, 0))

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

int ret = 0;
WSADATA wd;

/* charge la librairie */
if ( (ret = WSAStartup(_WINSCK_VER, &wd)) ) {

printf("Erreur lors du chargement de la librairie Winsock v%u.%u: %d\n", LOBYTE(_WINSCK_VER), HIBYTE(_WINSCK_VER), ret);
return 0;

}

/* vérifie que la version demandé est bien celle chargée */
if ( LOBYTE(wd.wVersion) != LOBYTE(_WINSCK_VER) ) {

printf("La librairie Winsock v%u.%u n'est pas disponible. Version disponible: %u.%u\n", LOBYTE(_WINSCK_VER), HIBYTE(_WINSCK_VER), LOBYTE(wd.wVersion), HIBYTE(wd.wVersion));

/* ici, on pourait très bien continuer l'exécution du soft quand même, si tu demande la version 1 et que seul la version 2 est dispo alors y'a pas vraiment de problème, ce qui est présent dans la version 1 est dispo dans la version 2 également sauf à quelques exceptions près */

WSACleanup();
return 0;

}

/* ton code ... */
/* ... */

WSACleanup();
return 0;

}

WSAStartup() charge la version qu'elle veut; Si la version que tu demande est disponible alors elle va la charger, sinon, elle va charger celle disponible sur le système.

Imagine que tu demande la version 3 et que cette version n'est pas disponible, seul la version 2 est dispo, tes fonctions qui requier les nouveautés dans la version 3 vont planter, bugger, ...


Bref, voilà .. c'était mes p'tits commentaires ...



~(.:: NitRic ::.)~
_sebf Messages postés 42 Date d'inscription jeudi 1 avril 2004 Statut Membre Dernière intervention 7 octobre 2006
5 sept. 2004 à 14:02
> Tes `tampons` de 65ko c'est BEAUCOUP trop, croit
> moi. Un simple `MAX_PATH` suffirait AMPLEMENT,
> sauf peut-être pour ta fonction
> `dimensionnement_de_data_a_envoyer()` dans
> lequel tu devrais plutôt demander un simple pointeur

Oui c'était pour ça, je pensais que ne déclarer qu'un seule variable tampon (grande afin de pourvoir être utilisée partout) était mieux que plein.

Je vais regarder ton conseil.

> Ta structure pour les adresses IP's locals, un array de
> 1000 ... c'est une blague j'espère !? 1000 adresses
> IP's ... ca fait un peu beaucoup non ?

:( bah oui, tu as raison.

> Tes `liberation_du_jeton()` sont, à 99.9% inutile, un
> simple `Sleep(0L)` suffirait amplement

Je ne comprend pas, cette fonction permet de rendre la main à l'interface graphique afin de permettre à l'utilisateur de continuer l'interaction pendant des boucles.

La fonction Sleep aurait pour effet de ralentir en bloquant l'interface, non ?

> et surtout
> dans ta fonction `calcul_du_checksum()` ou ton
> `liberation_du_jeton()` n'est pas utile du tout, au
> contraire, il est plutôt nuisible

Pourquoi dis tu que la fonction `calcul_du_checksum()` est inutile, elle est appelé par les autres fonctions de calcul du checksum des différentes entêtes.

Et pourquoi nuisible ?

> Le chargement le la librarie Winsock devrait ce faire
> au chargement du soft ou dès qu'elle est requise et
> déchargé une fois qu'elle ne l'est plus et non dans
> chaque fonction.
> Perso, je vérifie que la librarie ce soit bien chargé et
> que la version(major(LOBYTE()) principalement) que
> j'ai demandé est la bonne.

Je ne comprend pas, peux tu m'expliquer ?

> Pour l'include ... évite ce genre de path, ajoute des
> répertoires dans les options de ton IDE, même chose
> pour ta librarie.

Ok, thx

> J'opterais pour des pointeurs plutôt que des arrays
> de taille fixe.

Oui

> Ta librairie, 188ko, elle n'est surement pas compilé en
> release.
> Les 2 modes serait bien, debug & release, ta un
> header dans lequel tu link la bonne lib selon le mode
> de compilation du user(debug/release)

Oui je l'ai mis en Debug

> PS: Les critiques nous aident à mieux performer et à
> avancer dans la vie de tous les jours, ce n'est rien de
> méchant :)

Oui au contraire, merci.

_SebF

http://www.frameip.com
Un site pour les spécialistes IP
NitRic Messages postés 402 Date d'inscription mardi 1 mai 2001 Statut Membre Dernière intervention 15 août 2011
5 sept. 2004 à 08:54
-- Critiques --

Tes `tampons` de 65ko c'est BEAUCOUP trop, croit moi. Un simple `MAX_PATH` suffirait AMPLEMENT, sauf peut-être pour ta fonction `dimensionnement_de_data_a_envoyer()` dans lequel tu devrais plutôt demander un simple pointeur

Ta structure pour les adresses IP's locals, un array de 1000 ... c'est une blague j'espère !? 1000 adresses IP's ... ca fait un peu beaucoup non ?

Tes `liberation_du_jeton()` sont, à 99.9% inutile, un simple `Sleep(0L)` suffirait amplement et surtout dans ta fonction `calcul_du_checksum()` ou ton `liberation_du_jeton()` n'est pas utile du tout, au contraire, il est plutôt nuisible

Le chargement le la librarie Winsock devrait ce faire
au chargement du soft ou dès qu'elle est requise et déchargé une fois qu'elle ne l'est plus et non dans chaque fonction.
Perso, je vérifie que la librarie ce soit bien chargé et que la version(major(LOBYTE()) principalement) que j'ai demandé est la bonne.

Pour l'include ... évite ce genre de path, ajoute des répertoires dans les options de ton IDE, même chose pour ta librarie.

J'opterais pour des pointeurs plutôt que des arrays de taille fixe.

Ta librairie, 188ko, elle n'est surement pas compilé en release.
Les 2 modes serait bien, debug & release, ta un header dans lequel tu link la bonne lib selon le mode de compilation du user(debug/release)

etc ...
etc ...
etc ...
...

Pour répondre à `tibur`: Oui, cherche simplement `socket class` avec google et tu auras tout ce que tu veux et bien plus encore ...


PS: Les critiques nous aident à mieux performer et à avancer dans la vie de tous les jours, ce n'est rien de méchant :)
Pamaury Messages postés 341 Date d'inscription jeudi 3 avril 2003 Statut Membre Dernière intervention 17 juin 2008 3
4 sept. 2004 à 09:01
çà doit être réalisable non ? Il suffit d'un peut plus de code .
cs_tibur Messages postés 101 Date d'inscription samedi 9 février 2002 Statut Membre Dernière intervention 5 mai 2009
4 sept. 2004 à 03:56
Dommage que ca soit pas du C++.

Je cherche une lib objet qui permette d'utiliser les sockets comme des flux classiques de la std. (genre std::iostream).

Beau travail tout de même !
cs_Kirua Messages postés 3006 Date d'inscription dimanche 14 avril 2002 Statut Membre Dernière intervention 31 décembre 2008
4 sept. 2004 à 00:59
#pragma comment(lib,"ws2_32.lib")
#pragma comment(lib,"C:\\RepPerso\\Personnel\\Developpement\\Projets\\LibrairieSocket\\LibrairieSocket.lib")

dommage que ça ne soit pas super portable tout ça :(
le chemin de la lib, peu importe, c'est vite changé. c'est plus le fait d'utiliser les winsocks qui me chagrine. eeeeeenfin ^^

et puis, t'as été plutôt productif ajd lol! quasi ts les codes du jour sont de toi! quoique tu aurais souvent pu grouper (une version console et graphique, ça rentre ds un même exe sans problème quoi ^^)
Rejoignez-nous