Quoi ?
Où ?
[hint] Configuration de votre navigateur pour les travaux
En trois dessins valant mieux qu'un long discours, assurez vous que votre proxy/gateway sera dans les meilleures conditions pour les tests.

ATTENTION: pour ceux qui ne supportent pas les connexions persistantes, mozilla emploie un en-tête proxy-connection: keep-alive pour la connexion client-proxy. Cet en-tête est ignoré par les serveurs webs. Le changer en proxy-connection: close sera sans effet.
undeux
troy
[hint]

Strace & Segv.c : Débuggez comme au 21° siècle :)

En plus, la session de debugging est en ligne (strace, less et grep n'auront plus de secret pour vous ...), et vous avez même le fichier nero-trace avec la sortie complète de strace ...

Ajoutez "-Wall -g segv.c" à votre compilation, faites un segv_setup() et appelez votre programme avec
strace -s512 -onom_de_sortie ./btinfo fichier.torrent



Les perles de la programmation en C
Une petite collection de problèmes courants en programmation C et des pistes pour leur résolution.
chaînes
pointeurs
malloc
html
Modèles pour la programmation des serveurs
Les serveurs et passerelles pour les protocoles applicatifs d'Internet constituent un domaine de programmes dans lequel le traitement en parallèle de nombreuse requêtes indépendantes est monnaie courante. Ce document tente de dresser la liste des architectures logicielles possibles pour ce type d'application et de faire un bilan des forces et des faiblesses de chaque modèle.
pour de plus amples informations, se rapporter à Stevens, Unix Network Programming Vol. 1, chapitre 27 ISBN 0-13-490012-X
version html
html

The Art of HTTPing

Suite des "trucs & astuces", ce tutoriel présente deux méthodes peu recommendables (mais néanmoins fréquemment utilisées) pour lire une réponse HTTP en C, puis Ze méthode employant la bibliothèque stdio -- c'est ce que j'ai trouvé de mieux jusqu'ici ... A vos FILE* :)

ArtOfHTTPing
html BitTorrent -- Tutoriel
Un petit exemple montrant comment récupérer les infos du tracker et détaillant quelques scénario-type dans la communication entre peers.

Et au passage, 2 petits fichiers '.torrent' pour lancer les hostilités :-)
attention: le fichier specifix.torrent n'est plus supporté par son tracker... je le laisse quand-même à titre d'exemple (pour le tutoriel ;), mais n'espérez pas trop avoir une liste de peer... Plein d'autres torrents sont sur http://torrent.dulug.duke.edu/ et leurs hachages sur http://torrent.linux.duke.edu:6969/

printf("%%%02x",(unsigned char) hash[i]); pour "échapper" un caractère du hashage :-)

tutoriel

OCremix.torrent
specifix.torrent

exemple de passerelle applicative basée sur le modèle évènementiel.
La programmation événementielle peut demander un remaniement du style de programmation ... en voici un exemple.

sources
documentation
archive
petits programmes de démonstration des sockets
talker & listener + makefile + minidebug.h  
sources
archive Bibliothèque d'accès aux données b-encodées
Quasi-indispensable pour écrire un client BitTorrent en C ... permet de récupérer les valeurs, énumérer les listes, chercher dans les dictionnaires, etc.

trucs:
  • pour afficher correctement une chaîne, on utilise le mode  'précision': printf("%.10s","Hello World!") affiche "Hello Worl". Ici, comme la longueur du champ est inconnue a priori, on la passe avant le pointeur (* est alors utilisé comme longueur) printf("string:'%.*s'\n",beLen(s),beStr(s)); 
  • pour connaître la longueur (en bytes) d'une liste, on calcule quel est l'élément qui suit cette liste à l'aide de beNext(liste). Le nombre de caractères dans l'encodage de la liste vaut alors beNext(liste)-liste
  • pour énumérer les valeurs d'une liste, on utilisera d'abord items=beFirst(liste) pour entrer dans la liste puis  items=beNext(items) pour passer au suivant. La liste est terminée lorsque beTypeOf(items) renvoie beVOID. for(items=beFirst(liste);beTypeOf(items)!=beVOID;items=beNext(items));
bencoded.c
bencoded.h
archive Outil de débugging pour la programmation réseau
L'emploi est très simple: ajoutez "#include "segv.h" en tête de programme, appelez les fonctions setmainframe() et segv_setup() dans votre fonction main() et assurez-vous que callresolve.pl est exécutable.
Compilez ensuite avec
  gcc -g vosProgrammes segv.c -o votreProgramme.
En cas de signal d'erreur (SIG_ABRT pour un malloc erroné, SIG_PIPE pour un accès réseau erroné, SIG_SEGV pour un pointeur foireux, etc), le programme vous donnera un 'stacktrace' indiquant quelle fonction (fichier & n° de ligne) est incriminé.

Update: Ces outils fonctionnent maintenant également pour les programmes multithreads à condition de compiler "correctement":

 gcc -g -Wall threads_test.c -lpthread segv.c -D__THREADS__

En annexe, un petit programme (buggé, comme il se doit ;) illustrant l'utilisation du programme ...
segv.c
segv.h
callresolve.pl

threads_test.c
html
Trucs et astuces pour la programmation réseau

Présente quelques techniques simple de communication inter-processus utilisables dans un programme parallèle (socketpair).
Egalement disponible, un introduction à l'utilisation des socket à travers la bibliothèque stdio (aussi connus sous le nom de "socket enrobés de sucres") et de fscanf pour effectuer des lectures de haut-niveau sur un socket (pour tout ceux qui continuerait à croire que Java est mieux :)

Et finalement un petit mot sur la mémoire partagée simple et facile :P

tips.html
remote-host (client)
remote-host (server)
shmdemo

update: 28.10.4
html
Modèles de formulaire HTML simples
avec une analyse des messages émis par Mozilla en remplissant ce formulaire.
form.html
listing.html
message émis
html Norm Matloff's Debugging Tutorial
une page très intéressante sur l'obscure art du débugging, contenant notamment une introduction à l'utilisation de DDD.
<externe>
html Gestion d'une connexion HTTP avec pipelining dans un proxy

Petit tutoriel écrit par votre dévoué serviteur pour démystifier le principe du pipelining et explorer les différentes variantes (du plus simple au plus compliqué) de son support.
tutoriel

Enter the Dark Side -->
kung f00