Maintenant que vous disposez d'une connexion entre deux sockets, vous allez
vouloir échanger des données entre les deux machines mises en jeu (ou la même,
le réseau étant transparent, il peut s'agir de processus sur le même système,
peu importe). Et là, vous allez voir la magie de la chose : on utilise les
fonctions read()
et write()
, car ces sockets se présentent
sous la forme de descripteurs de fichiers ! Il y a toutefois une différence
majeure à prendre en compte par rapport aux fichiers; vous ne récupérez
généralement pas le nombre de caractères que vous avez demandé ; il vous faut
boucler jusqu'à avoir lu le compte désiré. Voici une fonction simple
permettant de lire des caractères depuis une socket, pour les mettre dans
un tampon :
int read_data(s,buf,n)
int s; /* socket connectee */
char *buf; /* pointeur sur le tampon */
int n; /* nombre de caracteres desires */
{
int bcount, /* compteur de caracteres lus au total */
br; /* nombre de caracteres lus cette fois */
bcount = 0;
br = 0;
while (bcount < n) { /* boucle jusqu'a remplissage du tampon */
if ((br = read(s, buf, n-bcount)) > 0) {
bcount += br; /* incrementation compteur de caracteres */
buf += br; /* deplace le pointeur d'une position */
}
else if (br < 0) /* signale qu'une erreur s'est produite */
return(-1);
}
return(bcount);
}
Il suffit d'écrire une fonction similaire pour l'écriture des données. Cela constituera un excellent exercice pour le lecteur.