Utilisation des sockets côté client en mode datagramme

En langage C :

Après avoir créé le socket, il va falloir envoyer un premier datagramme au serveur via la fonction sendto qui nécessite 6 paramètres :

Il va donc falloir déclarer une variante de la structure sockaddr correspondant à AF_INET. Il s'agit du type struct sockaddr_in. On commencera par mettre à zéro le contenu de cette structure via la fonction bzero de string.h, puis on affectera, au premier champ, nommé ici sin_family, la valeur AF_INET.

struct sockaddr_in	addr;

bzero(&addr, sizeof(addr));
addr.sin_family = AF_INET;
	

Il faut ensuite remplir, dans la structure, le champ sin_addr avec l'adresse IPv4 du serveur à contacter et le champ sin_port avec le numéro de son port UDP.

Remarques :

inet_aton("127.0.0.1", &addr.sin_addr);
addr.sin_port = htons(7);
	

Ayant ainsi précisé l'adresse 127.0.0.1 et le port 7, il ne reste plus qu'à appeler la fonction sendto pour que le client cherche à établir la connexion avec le serveur echo local.

sendto(fd, &buffer, sizeof(buffer), MSG_CONFIRM, (struct sockaddr *) &addr, sizeof(addr));
	

Exemple :

#include <stdio.h>
#include <stdlib.h>

#include <sys/types.h>
#include <netdb.h>
#include <sys/socket.h>

#include <string.h>		// pour les fonctions bzero et strlen
#include <arpa/inet.h>	// pour la fonction inet_addr

int main()
{
	int fd;
	struct sockaddr_in addr;
	int err;
	char buffer[]="Hello !";

	fd = socket (AF_INET, SOCK_DGRAM, IPPROTO_UDP);
	if (fd<0) {
		printf("Erreur de creation de la socket !\n");
		exit(1);
	}

	bzero(&addr, sizeof(addr));
	addr.sin_family = AF_INET;
	err = inet_aton("127.0.0.1", &addr.sin_addr);
	if (err == 0) {
		printf("Adresse IPv4 invalide !\n");
		exit(1);
	}
	addr.sin_port = htons(8080);

	sendto(fd, &buffer, strlen(buffer), MSG_CONFIRM, (struct sockaddr *) &addr, sizeof(addr)); 

	printf("Message envoyé au serveur !\n");
	return 0;
}
	

PHP et Python :

Dans les langages comme PHP ou Python, il existe des bibliothèques faisant l'interface avec les fonctions systèmes.

PHP

Le code de l'exemple écrit en C devient en PHP :

$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
if ($socket == false) die("Erreur de création de la socket !\n");
$buffer = "Hello !";
$len = strlen($buffer);
socket_sendto($socket, $buffer, $len, '127.0.0.1', 8080);
echo "Message envoyé au serveur !\n";
	

Python

Le code de l'exemple écrit en C devient en Python :

try :
	sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
	sock.sendto("Hello !",('127.0.0.1',8080))
except socket.error :
	print("Erreur de communication du client !")
	exit()
print("Message envoyé au serveur !")