Qu’est-ce que la programmation Socket ?
La programmation socket est un moyen de connecter deux nœuds sur un réseau pour communiquer entre eux. Un socket (nœud) écoute sur un port particulier sur une adresse IP, tandis que l'autre socket tend la main à l'autre pour établir une connexion. Le serveur forme le socket d'écoute tandis que le client contacte le serveur.
Diagramme d'état pour le modèle serveur et client

Diagramme d'état pour le modèle serveur et client de Socket
Étapes pour le serveur
Le serveur est créé en suivant les étapes suivantes :
fonctions de chaîne Java
1. Création de sockets
int sockfd = socket(domain, type, protocol)>
- sockfd : descripteur de socket, un entier (comme un descripteur de fichier) domain : entier, spécifie le domaine de communication. Nous utilisons AF_LOCAL tel que défini dans le standard POSIX pour la communication entre les processus sur le même hôte. Pour communiquer entre les processus sur différents hôtes connectés par IPV4, nous utilisons AF_INET et AF_I NET 6 pour les processus connectés par IPV6. type : type de communication
SOCK_STREAM : TCP (fiable, orienté connexion)
SOCK_DGRAM : protocole UDP (non fiable, sans connexion) : valeur de protocole pour le protocole Internet (IP), qui est 0. Il s'agit du même numéro qui apparaît dans le champ de protocole dans l'en-tête IP d'un paquet. (man protocols pour plus de détails)
2. Définir l'option
Cela aide à manipuler les options du socket référencé par le descripteur de fichier sockfd. Ceci est complètement facultatif, mais cela facilite la réutilisation de l'adresse et du port. Empêche les erreurs telles que : adresse déjà utilisée.
int setsockopt(int sockfd, int level, int optname, const void *optval, socklen_t optlen);>
3. Lier
int bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen);>
Après la création du socket, la fonction bind lie le socket à l'adresse et au numéro de port spécifiés dans addr (structure de données personnalisée). Dans l'exemple de code, nous lions le serveur à l'hôte local, nous utilisons donc INADDR_ANY pour spécifier l'adresse IP.
4. Écoutez
int listen(int sockfd, int backlog);>
Il met le socket du serveur en mode passif, où il attend que le client s'approche du serveur pour établir une connexion. Le backlog définit la longueur maximale à laquelle la file d'attente des connexions en attente pour sockfd peut croître. Si une demande de connexion arrive alors que la file d'attente est pleine, le client peut recevoir une erreur avec une indication d'ECONNREFUSED.
5. Acceptez
int new_socket= accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);>
Il extrait la première demande de connexion dans la file d'attente des connexions en attente pour le socket d'écoute, sockfd, crée un nouveau socket connecté et renvoie un nouveau descripteur de fichier faisant référence à ce socket. À ce stade, la connexion est établie entre le client et le serveur et ils sont prêts à transférer des données.
Étapes pour le client
1. Connexion de la prise : Exactement la même chose que celle de la création du socket du serveur
2. Connectez-vous : L'appel système connect() connecte le socket référencé par le descripteur de fichier sockfd à l'adresse spécifiée par addr. L'adresse et le port du serveur sont spécifiés dans l'adr.
int connect(int sockfd, const struct sockaddr *addr, socklen_t addrlen);>
Mise en œuvre
Ici, nous échangeons un message de bonjour entre le serveur et le client pour démontrer le modèle client/serveur.
Programme C pour créer un serveur
Serveur.c
C
méthode de chaîne en Java
// Server side C program to demonstrate Socket> // programming> #include> #include> #include> #include> #include> #include> #define PORT 8080> int> main(>int> argc,>char> const>* argv[])> {> >int> server_fd, new_socket;> >ssize_t valread;> >struct> sockaddr_in address;> >int> opt = 1;> >socklen_t addrlen =>sizeof>(address);> >char> buffer[1024] = { 0 };> >char>* hello =>'Hello from server'>;> >// Creating socket file descriptor> >if> ((server_fd = socket(AF_INET, SOCK_STREAM, 0)) <0) {> >perror>(>'socket failed'>);> >exit>(EXIT_FAILURE);> >}> >// Forcefully attaching socket to the port 8080> >if> (setsockopt(server_fd, SOL_SOCKET,> >SO_REUSEADDR | SO_REUSEPORT, &opt,> >sizeof>(opt))) {> >perror>(>'setsockopt'>);> >exit>(EXIT_FAILURE);> >}> >address.sin_family = AF_INET;> >address.sin_addr.s_addr = INADDR_ANY;> >address.sin_port = htons(PORT);> >// Forcefully attaching socket to the port 8080> >if> (bind(server_fd, (>struct> sockaddr*)&address,> >sizeof>(address))> ><0) {> >perror>(>'bind failed'>);> >exit>(EXIT_FAILURE);> >}> >if> (listen(server_fd, 3) <0) {> >perror>(>'listen'>);> >exit>(EXIT_FAILURE);> >}> >if> ((new_socket> >= accept(server_fd, (>struct> sockaddr*)&address,> >&addrlen))> ><0) {> >perror>(>'accept'>);> >exit>(EXIT_FAILURE);> >}> >valread = read(new_socket, buffer,> >1024 - 1);>// subtract 1 for the null> >// terminator at the end> >printf>(>'%s
'>, buffer);> >send(new_socket, hello,>strlen>(hello), 0);> >printf>(>'Hello message sent
'>);> >// closing the connected socket> >close(new_socket);> >// closing the listening socket> >close(server_fd);> >return> 0;> }> |
>
>
Programme C pour créer un client
client.c
C
// Client side C program to demonstrate Socket> // programming> #include> #include> #include> #include> #include> #define PORT 8080> int> main(>int> argc,>char> const>* argv[])> {> >int> status, valread, client_fd;> >struct> sockaddr_in serv_addr;> >char>* hello =>'Hello from client'>;> >char> buffer[1024] = { 0 };> >if> ((client_fd = socket(AF_INET, SOCK_STREAM, 0)) <0) {> >printf>(>'
Socket creation error
'>);> >return> -1;> >}> >serv_addr.sin_family = AF_INET;> >serv_addr.sin_port = htons(PORT);> >// Convert IPv4 and IPv6 addresses from text to binary> >// form> >if> (inet_pton(AF_INET,>'127.0.0.1'>, &serv_addr.sin_addr)> ><= 0) {> >printf>(> >'
Invalid address/ Address not supported
'>);> >return> -1;> >}> >if> ((status> >= connect(client_fd, (>struct> sockaddr*)&serv_addr,> >sizeof>(serv_addr)))> ><0) {> >printf>(>'
Connection Failed
'>);> >return> -1;> >}> >send(client_fd, hello,>strlen>(hello), 0);> >printf>(>'Hello message sent
'>);> >valread = read(client_fd, buffer,> >1024 - 1);>// subtract 1 for the null> >// terminator at the end> >printf>(>'%s
'>, buffer);> >// closing the connected socket> >close(client_fd);> >return> 0;> }> |
top 10 hentaï
>
>
Sortir
Client:Hello message sent Hello from server Server:Hello from client Hello message sent>
Compilation
gcc client.c -o client gcc server.c -o server>
Suivant : Programmation Socket en C/C++ : gestion de plusieurs clients sur le serveur sans multithreading