Différence TCP & UDP
TCP (SOCK_STREAM)
- Connecté : établissement d'une connexion avant l'échange de données
- Fiabilité : garantie de livraison et d'ordre des paquets
- Idéal pour : transfert de fichiers, web, email
UDP (SOCK_DGRAM)
- Non Connecté : envoi direct des datagrammes
- Pas de garantie de livraison ou d'ordre
- Plus léger et plus rapide
- Idéal pour : streaming, jeux en ligne, DNS
Architecture
A Savoir
- Conversions réseau :
htons() : Host TO Network Short (pour les ports)
htonl() : Host TO Network Long (pour les adresses IP)
ntohs() : Network TO Host Short (pour récupérer le port dans la packet client)
inet_ntoa() : Network TO Address (pour récupérer l’IP dans la packet client)
inet_aton() : Address TO Network (convertit une IP string en binaire)
TCP
Général
- Ordre des opérations :
- Client : socket → config adresse→ connect → write/read → close
- Serveur : socket → config adresse→ bind → listen → accept → adresse cli → read/write → close
- Serveur (fork) : socket → config adresse→ bind → listen → accept → adresse cli → fork → (close socket serveur sur le fork, close socket client sur le processus parent) → read/write → exit fork →close
- Serveur (thread) : socket → config adresse→ bind → listen → accept → adresse cli → pthread_create → pthread_detach → read/write → pthread_exit →close
Client
// Création du socket
int sockfd = socket(AF_INET, SOCK_STREAM, 0);
// Configuration de l'adresse
struct sockaddr_in serv_addr;
serv_addr.sin_family = AF_INET;
serv_addr.sin_port = htons(PORT);
inet_aton("127.0.0.1", &serv_addr.sin_addr);
// Connexion
connect(sockfd, (struct sockaddr*)&serv_addr, sizeof(serv_addr));
// Lecture console et envoi
char buffer[1024];
fgets(buffer, sizeof(buffer), stdin);
write(sockfd, buffer, strlen(buffer));
// Fermeture
close(sockfd);
Serveur TCP (1 client)
// Création du socket
int server_fd = socket(AF_INET, SOCK_STREAM, 0);
// Configuration de l'adresse
struct sockaddr_in address;
address.sin_family = AF_INET;
address.sin_port = htons(PORT);
address.sin_addr.s_addr = htonl(INADDR_ANY);
// Bind
bind(server_fd, (struct sockaddr*)&address, sizeof(address));
// Listen
listen(server_fd, 3);
// Accept
struct sockaddr_in client_addr;
int client_len = sizeof(client_addr);
int client_fd = accept(server_fd, (struct sockaddr*)&client_addr, &client_len);
// Info client
printf("Client IP: %s\\n", inet_ntoa(client_addr.sin_addr));
printf("Client Port: %d\\n", ntohs(client_addr.sin_port));
// Lecture données
char buffer[1024];
read(client_fd, buffer, sizeof(buffer));
// Fermeture
close(client_fd);
close(server_fd);