Librairie manipulant les socket

Soyez le premier à donner votre avis sur cette source.

Vue 4 882 fois - Téléchargée 650 fois

Description

Bonjour,

Voici le code source d'une librairie proposant plusieurs dizaines de fonctions manipulant les socket. Cette librairie est utilisée par tous mes programmes que je publie aussi ici. Comme d'habitude, le code est composé de nombreux commentaires afin de vous permettre une meilleur compréhension et apprentissage.

Vous y trouverez des fonctions tel que la résolution de nom, la récupération des IP locales, les différents calculs checksum, génération aléatoire d'adresse IP, conversion d'adresse IP et bien d'autres.

Vous trouverez tous sur la librairie ici : http://www.frameip.com/librairie/

----------------------
_sebf
http://www.frameip.com
Un site pour les spécialistes IP
----------------------

Codes Sources

A voir également

Ajouter un commentaire Commentaires
Messages postés
402
Date d'inscription
mardi 1 mai 2001
Statut
Membre
Dernière intervention
15 août 2011

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.
Messages postés
42
Date d'inscription
jeudi 1 avril 2004
Statut
Membre
Dernière intervention
7 octobre 2006

> 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
Messages postés
402
Date d'inscription
mardi 1 mai 2001
Statut
Membre
Dernière intervention
15 août 2011

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 ::.)~
Messages postés
42
Date d'inscription
jeudi 1 avril 2004
Statut
Membre
Dernière intervention
7 octobre 2006

> 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
Messages postés
402
Date d'inscription
mardi 1 mai 2001
Statut
Membre
Dernière intervention
15 août 2011

-- 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 :)
Afficher les 8 commentaires

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.