tiens au passage mon cours de socket en C de l'an dernier :
Programmation des sockets
I) Introduction
socket = extension de la notion de descripteur de fichier
-> caractérisé par un descripteur inséré ds la table des descripteurs d'un process
-> utilisation des fonctions standard
implémenté pr la 1ere fois sous unix BSD
II) Concepts de base
1) Famille de protocole et famille d'adressage (domaine)
a) Famille de protocole (Protocol Family)
Ensemble de protocoles répondant à une caractérisitique commune dans le cadre d'une architecture réseau
ex : PF_INET caractérise les protocoles Internet reposant sur IP (TCP et UDP par ex)
ex : PF_UNIX caractérise les protocoles propres aux systèmes UNIX
b) Famille d'adresse (Adresse Family)
Ensemble de protocoles définissant un point de connection réseau de manière identique
ex : AF_INET : il faut le couple adresse IP / n° de port (www.ec-lille.fr / 80 pr accéder au serveur de l'école)
extrait de <sys/socket.h> (pr montrer pkoi on dit souvent que y a pas de diff entre PF_xxx et AF_xxx)
#define PF_UNIX 0
#define PF_INET 1
#define PF_APPLTALK 2
...
...
#define AF_INET PF_INET
2) Type de socket
couche application du modèle OSI
SOCK_DGRAM : socket de type datagram pour communication en mode non connecté (rapide mais non fiable) -> ex : UDP
SOCK_STREAM : flux en mode connecté (fiable) -> ex : TCP
SOCK_RAW : socket "brute" servant à définir de nouveau protocole -> accès direct à IP
III) Famille d'adressage et structures de données
* sys/socket.h
struct sockaddr {
u_short sa_family; /* famille d'adressage */
char sa_data[14]; /* autres données d'une famille d'adressage */
}
* AF_UNIX (machine locale)
sys/un.h
struct sockaddr_un {
u_short sun_family; /* AF_UNIX */
cahr sun_path[108]; /* Nom du pseudo fichier de synchro */
}
pseudo fichier de synchro : il apparait avec un ls -la (avec la lettre s au debut de ses attributs de protection)
* AF_INET
netinet/in.h
struct sockaddr_in {
u_short sin_family; /* AF_INET */
u_short sin_port; /* port de connection */
struct in_addr sin_addr; /* adresse IP */
char sin_zero[8]; /* réservé */
}
struct in_addr {
u_long s_addr;
}
IV) Primitives de programmation de sockets
1) Création d'un socket
int socket (u_short domain, /* famille d'adressage : AF_UNIX, AF_INET */
int type, /* type de socket : SOCK_DGRAM, SOCK_STREAM */
int protocol /* mettre 0 pr le protocol par défaut (svt y en a qu'un de tte facon) */
);
L'entier retourné est un descripteur de socket.
ATTENTION !
descripteur de fichier :
0 = entrée standard (stdin)
1 = sortie standard (stdout)
2 = sortie erreur (stderror)
2) Liaison d'une socket (bind)
Permet d'associer une adresse a une socket
int bind (int sd, /* descripteur de socket */
struct sockaddr * addr, /* addresse associée */
int longueur /* nbre d'octets de addr */
);
Renvoi -1 en cas d'erreur.
Pour les primitives suivantes, regardé ds le manuel
3) Primitives d'entrees/sorties
a) Lecture
En mode non connecté : recvfrom
En mode connecté : recv, read (standard)
b) Ecriture
En mode non connecté : sendto
En mode connecté : send, write
4) Etablir une connection
process actif (écrivain/client) | process passif (lecteur/serveur)
---------------------------------+------------------------------------
socket -> sde | socket -> se (socket d'écoute)
| bind -> se est lié à une adresse
| listen -> se écoute les demandes de connection
connect -> demande de connection | accept -> accepter une demande -> sd = socket de dialogue
ecriture sur sde --------------->lecture sur sdl...
lecture sur sde <---------------ecriture sur sdl...
5) Libération d'une socket
int shutdown( int sd, int mode);
mode = 0 -> socket bloqué en lecture
mode = 1 -> socket bloqué en écriture
mode = 2 -> socket complètement fermé
close (int sd);
Equivalent a shutdown avec mode = 2
6) Divers
*AF_UNIX
unlink(char *) -> supression du pseudo fichier ("sun_path" )
A NE PAS OUBLIER EN FIN DE FICHER, SINON ERREUR BIND QD ON RELANCE LE PROG
*Gestion des erreurs
perror
*Fonction de conversion d'entiers
htons ou htonl (host to network short/long)
ntohs ou ntohl (network to host short/long)