Programmation réseau 4: Une brève analyse de l'API fournie par Linux (étapes de développement pour le serveur et le client Socket)

Une brève analyse de l'API fournie par Linux (étapes de développement pour le serveur et le client Socket)

1. Protocole de connexion: (TCP / UDP)

//创建套接字
#include <sys/types.h>
#include <sys/socket.h>
int socket(int domain,int type,int protocol);
返回sockfd---失败返回-1

domaine:
spécifiez la famille de protocoles utilisée, généralementAF_INET, Représente la famille de protocoles Internet (famille de protocoles TCP / IP);

Domaine Internet AF_INET IPV4
AF_INET6 Domaine Internet IPV6 AF_UNIX domaine
unix
AF_ROUTE socket de routage
AF_KEY key socket
AF_UNSPEC non spécifié

Le paramètre type spécifie le type de socket:
SOCK_STREAM: La
prise de streaming fournit un flux de communication fiable et orienté connexion, elle utilise le protocole TCP pour garantir l'exactitude et la séquence de la transmission des données
SOCK_DGRAM: La
socket datagramme définit un serveur sans connexion. Les données sont transmises via des messages indépendants. Elle est désordonnée, ne garantit pas la fiabilité et est sans erreur. Elle utilise le protocole de datagramme UDP .
SOCK_RAW:
Permet au programme d'utiliser le protocole sous-jacent. Le socket d'origine s'exécute pour accéder directement au protocole sous-jacent tel que IP ou ICMP. Il est puissant mais peu pratique à utiliser. Il est principalement utilisé pour le développement de certains protocoles .


protocole
reçoit généralement la valeur "0
0 Sélectionnez le protocole par défaut correspondant au type de type
== IPPROTO_TCP TCP Transmission Protocol ==
IPPROTO_UDP UDP Transmission Protocol
IPPROTO_SCTP SCTP Transmission Protocol
IPPROTO_TIPC TIPC Transmission Protocol

2. Fonction d'attribution du numéro IP, du numéro de port et du mot de description correspondant: fonction bind ()

#include <sys/types.h>
#include <sys/socket.h>
int bind(int sockfd, const struct sockaddr *addr,socklen_t addrlen);

La fonction bind () attribue une adresse spécifique dans une famille d'adresses au socket. Par exemple, correspondre à AF_INET et AF_INET6 consiste à attribuer une adresse ipv4 ou ipv6 et une combinaison de numéro de port au socket.

Fonction: Utilisé pour lier l'adresse IP et le numéro de port aux
paramètres socketfd :
sockfd: Le mot de description de socket, qui est créé par la fonction socket () et identifie de manière unique une socket. La fonction bind () liera un nom à ce descripteur.
adr: Un pointeur const struct sockaddr *, pointant vers le sockfd à lierAdresse de protocole
addrlen: Correspond à la longueur de l'adresse.

Structure d'adresse de protocoleIl varie en fonction de la famille de protocoles d'adresse lors de la création du socket. Par exemple, ipv4 correspond à:

struct sockaddr_in {
    
    
    sa_family_t    sin_family; //协议族
    in_port_t      sin_port;   //端口号
    struct in_addr sin_addr;   //IP地址结构体
};
struct in_addr {
    
    
    uint32_t       s_addr;     /* address in network byte order */
};

Habituellement, le serveur liera une adresse bien connue == (telle que l'adresse IP + le numéro de port) == lorsque le serveur est démarré, qui est utilisée pour fournir des services, et le client peut se connecter au serveur via celui-ci; le client n'a pas besoin d'être spécifié et le système automatiquement Attribuez un numéro de port et sa propre combinaison d'adresses IP. C'est pourquoi le serveur appellera généralement bind () avant d'écouter, mais le client ne l'appellera pas. Au lieu de cela, le système en génère un aléatoirement lors de connect ().

3. fonction de surveillance d'écoute (), fonction de connexion connect ()

Si en tant que serveur, après avoir appelé socket () et bind (), listen () sera appelé pour surveiller le socket. Si le client appelle connect () pour envoyer une demande de connexion à ce moment, le serveur recevra la demande.

#include <sys/types.h> 
#include <sys/socket.h>
int listen(int sockfd, int backlog);
int connect(int sockfd, const struct sockaddr *addr, socklen_t addrlen);

Le premier paramètre de la fonction d'écoute est celui à surveillermot de description de socket, Le deuxième paramètre est la file d'attente que le socket correspondant peut mettre en file d'attenteNombre maximum de connexions. Le socket créé par la fonction socket () est de type actif par défaut, et la fonction listen transforme le socket en un type passif et attend la demande de connexion du client.

Le premier paramètre de la fonction de connexion estLa description de socket du client, Le deuxième paramètre estL'adresse de socket du serveur, Le troisième paramètre est l'adresse du socketlongueur. Le client établit une connexion avec le serveur TCP en appelant la fonction de connexion.
  
4. accepter () la fonction de demande de réception

Une fois que le serveur TCP a appelé tour à tour socket (), bind () et listen (), il écoutera l'adresse de socket spécifiée. Une fois que le client TCP a appelé tour à tour socket () et connect (), il envoie une demande de connexion au serveur TCP. Une fois que le serveur TCP a écouté la demande, il appellera la fonction accept () pour recevoir la demande, afin que la connexion soit établie. Après cela, vous pouvez démarrer des opérations d'E / S réseau, c'est-à-dire lire et écrire des opérations d'E / S similaires aux fichiers ordinaires.

#include <sys/types.h> 
#include <sys/socket.h>
int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen); //返回连接connect_fd

Les trois paramètres de la fonction sont:

sockfd: est le socket d'écoute expliqué ci-dessus. Ce socket est utilisé pour surveiller un port. Lorsqu'un client se connecte au serveur, il utilise ce numéro de port, et ce numéro de port est actuellement connecté à ce socket Associé. Bien entendu, le client ne connaît pas les détails du socket, il ne connaît qu'une adresse et un numéro de port.
addr: il s'agit d'un paramètre de résultat, qui est utilisé pour recevoir une valeur de retour. Cette valeur de retour spécifie l'adresse du client. Bien sûr, cette adresse est décrite par une certaine structure d'adresse. L'utilisateur doit savoir de quel type de structure d'adresse il s'agit. Si l'adresse du client ne vous intéresse pas, vous pouvez définir cette valeur sur NULL.
len: Comme tout le monde le pense, c'est aussi le paramètre du résultat. Il est utilisé pour accepter la taille de la structure addr ci-dessus. Il indique le nombre d'octets occupés par la structure addr. De même, il peut également être défini sur NULL.

Si l'acceptation retourne avec succès, le serveur et le client ont correctement établi une connexion et le serveur termine la communication avec le client via le socket renvoyé par l'acceptation.

Remarque:
Accept bloque le processus par défaut jusqu'à ce qu'une connexion client soit établie et retourne. Il renvoie un socket nouvellement disponible, qui est un socket de connexion.

À ce stade, nous devons distinguer deux types de sockets:

Prise d'écoute: La socket d'écoute est exactement comme le paramètre accept sockfd. C'est la socket d'écoute. Une fois la fonction d'écoute appelée, le serveur commence à appeler la fonction socket (). On l'appelle le descripteur de socket d'écoute (socket de surveillance)
Connecter la prise: Une prise passera d'une prise activement connectée à une prise d'écoute; et la fonction d'acceptation renvoie la description de la prise connectée (une prise connectée), qui représente le point où un réseau existe déjà lien.

Un serveur ne crée généralement qu'un descripteur de socket d'écoute, qui existe toujours pendant le cycle de vie du serveur. Le noyau crée un descripteur de socket connecté pour chaque connexion client acceptée par le processus serveur. Lorsque le serveur termine le service pour un certain client, le descripteur de socket connecté correspondant est fermé.

Le socket de connexion socketfd_new n'occupe pas de nouveau port pour communiquer avec le client et utilise toujours le même numéro de port que le socket d'écoute socketfd.
  
5.read (), write () et autres fonctions

Il existe les groupes d'opérations d'E / S réseau suivants:

read()/write()
recv()/send()
readv()/writev()
recvmsg()/sendmsg()
recvfrom()/sendto()

6. fermer la fonction

int close(int fd);

Le comportement par défaut de la fermeture d'un socket TCP est de marquer le socket comme fermé, puis de revenir immédiatement au processus appelant. Le mot de description ne peut plus être utilisé par le processus appelant, ce qui signifie qu'il ne peut plus être utilisé comme premier paramètre de lecture ou d'écriture.

Remarque: L'opération de fermeture effectue uniquement le décompte de références du mot de description de socket correspondant -1, et ce n'est que lorsque le décompte de références est égal à 0 que le client TCP envoie une demande de terminaison de connexion au serveur.

7. API de traduction d'adresses:

#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
int inet_aton(const char *cp, struct in_addr *inp);
//把字符串形成的“192.168.1.123”转为网络能识别的格式
char *inet_ntoa(struct in_addr in);
//把网络格式的ip地址转化为字符串形式

8. API de conversion Endian:

#include <arpa/inet.h>
uint32_t htonl(uint32_t hostlong);//返回网络字节序的值
uint16_t htons(uint16_t hostshort);//返回网络字节序的值
uint32_t ntohl(uint32_t netlong);//返回主机字节序的值uint32_t
uint16_t ntohs(uint16_t netshort);//返回主机字节序的值

h représente l'hôte, n représente net, s représente court (deux octets) et l représente long (4 octets); la conversion entre l'ordre des octets de l'hôte et l'ordre des octets du réseau peut être réalisée via les quatre fonctions ci-dessus. Parfois, il peut être utiliséINADDR_ANY, INADDR_ANY spécifie l'adresse que le système d'exploitation doit obtenir.

L'écriture de code entre le client et le serveur peut être effectuée via l'API ci-dessus

Voir la section suivante pour l'implémentation du codeProgrammation réseau 5Explique

Je suppose que tu aimes

Origine blog.csdn.net/weixin_40734514/article/details/108555217
conseillé
Classement