[Programmation réseau] Résumé des fonctions couramment utilisées

Format de socket

Format de prise universel

/* POSIX.1g 规范规定了地址族为2字节的值.  */
typedef unsigned short int sa_family_t;
/* 描述通用套接字地址  */
struct sockaddr{
    sa_family_t sa_family;  /* 地址族.  16-bit*/
    char sa_data[14];   /* 具体的地址值 112-bit */
  }; 

Format d'adresse de socket IPv4


/* IPV4套接字地址,32bit值.  */
typedef uint32_t in_addr_t;
struct in_addr
  {
    in_addr_t s_addr;
  };
  
/* 描述IPV4的套接字地址格式  */
struct sockaddr_in
  {
    sa_family_t sin_family; /* 16-bit AF_INET*/
    in_port_t sin_port;     /* 端口口  16-bit*/
    struct in_addr sin_addr;    /* Internet address. 32-bit */


    /* 这里仅仅用作占位符,不做实际用处  */
    unsigned char sin_zero[8];
  };

Format d'adresse de socket IPv6

struct sockaddr_in6
  {
    sa_family_t sin6_family; /* 16-bit AF_INET6*/
    in_port_t sin6_port;  /* 传输端口号 # 16-bit */
    uint32_t sin6_flowinfo; /* IPv6流控信息 32-bit*/
    struct in6_addr sin6_addr;  /* IPv6地址128-bit */
    uint32_t sin6_scope_id; /* IPv6域ID 32-bit */
  };

Format d'adresse de socket local

struct sockaddr_un {
    unsigned short sun_family; /* 固定为 AF_LOCAL */
    char sun_path[108];   /* 路径名 */
};

API de socket commune

socket créer socket

#include <sys/types.h>          /* See NOTES */
#include <sys/socket.h>

int socket(int domain, int type, int protocol);
/*
参数:
    domain:选择协议族PF_INET、PF_INET6 以及 PF_LOCAL 等
    type: 明确交流语义
        SOCK_STREAM: 有序,可靠基于连接的字节流;TCP
        SOCK_DGRAM:面向无连接的不可靠的数据报; UDP
        SOCK_RAW: 表示的是原始套接字。
    protocol:指定通信协议,已废弃,一般写成0 
*/
/*
返回值:
    创建成功,返回文件描述符
    失败,返回-1
*/

bind bind socket et socket address

Fonction: Liez ensemble les paramètres sockfd et addr, de sorte que sockfd, le descripteur de fichier pour la communication réseau, écoute l'adresse et le numéro de port décrits par addr. struct sockaddr * est un type de pointeur universel. Le paramètre addr peut réellement accepter des structures sockaddr de plusieurs protocoles, et leurs longueurs sont différentes, donc le troisième paramètre addrlen est requis pour spécifier la longueur de la structure.

#include <sys/types.h>          /* See NOTES */
#include <sys/socket.h>

int bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen);
/*
参数:
    sockfd: 待绑定的套接字,文件描述符
    addr: 套接字地址,构造出IP地址+端口号
    addrlen: 绑定的套接字地址的大小
*/
/*
返回值:
    创建成功,返回0
    失败,返回-1
*/
/*Example*/
struct sockaddr_in servaddr;
bzero(&servaddr, sizeof(servaddr)); //将整个结构体清零
servaddr.sin_family = AF_INET; //设置地址类型为AF_INET,这个宏表示本地的任意IP地址,
                               //因为服务器可能有多个网卡,每个网卡也可能绑定多个IP地址,
                               //这样设置可以在所有的IP地址上监听,直到与某个客户端建立了连接时才确定下来到底用哪个IP地址,端口号为6666。
servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
servaddr.sin_port = htons(6666);

écouter convertit la prise active en prise passive

Rôle: Un programme serveur typique peut servir plusieurs clients en même temps. Lorsqu'un client établit une connexion, le serveur accepte () renvoie et accepte la connexion. Si un grand nombre de clients établissent une connexion et que le serveur n'a pas le temps de la traiter, il n'a pas encore accepté Le client est dans l'état d'attente de connexion, listen () déclare que sockfd est dans l'état d'écoute, et au plus les clients en attente sont autorisés à être dans l'état d'attente de connexion. Si plus de demandes de connexion sont reçues, elles sont ignorées. listen () renvoie 0 en cas de succès et -1 en cas d'échec.

#include <sys/types.h> /* See NOTES */
#include <sys/socket.h>
int listen(int sockfd, int backlog);

/*
参数:
    sockfd: 套接字,文件描述符
    backlog:排队建立3次握手队列和刚刚建立3次握手队列的链接数和 
    cat /proc/sys/net/ipv4/tcp_max_syn_backlog //查看系统默认backlog
*/
/*
返回值:
    创建成功,返回0
    失败,返回-1
*/

accepter d'accepter la connexion

Fonction: Une fois la négociation à trois terminée, le serveur appelle accept () pour accepter la connexion. S'il n'y a pas de demande de connexion client lorsque le serveur appelle accept (), il bloque et attend jusqu'à ce qu'un client se connecte. addr est un paramètre sortant, et l'adresse et le numéro de port du client sont transmis lorsque accept () revient. Le paramètre addrlen est un paramètre entrant et sortant (argument valeur-résultat). La longueur entrante du tampon addr fourni par l'appelant est utilisée pour éviter le débordement de la mémoire tampon. La longueur sortante est la longueur réelle de la structure d'adresse du client. Il peut ne pas remplir le tampon fourni par l'appelant). Si NULL est passé au paramètre addr, cela signifie que l'adresse du client n'est pas concernée.

#include <sys/types.h> 		/* See NOTES */
#include <sys/socket.h>
int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);
/*
参数:
    sockfd: 套接字,文件描述符
    addr: 传出参数,返回链接客户端地址信息,含IP地址和端口号
    addrlen: 传入传出参数(值-结果),传入sizeof(addr)大小,函数返回时返回真正接收到地址结构体的大小
*/
/*
返回值:
    创建成功,返回新的文件描述符,用于通信
    失败,返回-1
*/

L'ensemble est une boucle while, chaque boucle traitant une connexion client. Étant donné que cliaddr_len est un paramètre entrant et sortant, la valeur initiale doit être réaffectée avant chaque appel accept (). Le paramètre listenfd de accept () est le descripteur de fichier précédent et la valeur de retour de accept () est un autre descripteur de fichier connfd. Après cela, il communique avec le client via ce connfd, et ferme enfin le connfd pour se déconnecter, mais pas Fermez listenfd et revenez au début de la boucle. Listenfd est toujours utilisé comme paramètre d'acceptation. accept () renvoie un descripteur de fichier en cas de succès et -1 en cas d'erreur.

/*示例*/
while (1) {
	cliaddr_len = sizeof(cliaddr);
	connfd = accept(listenfd, (struct sockaddr *)&cliaddr, &cliaddr_len);
	n = read(connfd, buf, MAXLINE);
	......
	close(connfd);
}

se connecter

Le client doit appeler connect () pour se connecter au serveur. Les paramètres de connexion et de liaison sont les mêmes. La différence est que le paramètre de liaison est sa propre adresse et le paramètre de connexion est l'adresse de l'autre partie. connect () renvoie 0 en cas de succès et -1 en cas d'erreur.

#include <sys/types.h> 					/* See NOTES */
#include <sys/socket.h>
int connect(int sockfd, const struct sockaddr *addr, socklen_t addrlen);
/*
参数:
    sockfd: 套接字,文件描述符
    addr: 传入参数,指定服务器端地址信息,含IP地址和端口号
    addrlen: 传入参数,传入sizeof(addr)大小
*/
/*
返回值:
    创建成功,返回0
    失败,返回-1
*/

Je suppose que tu aimes

Origine www.cnblogs.com/Trevo/p/12615848.html
conseillé
Classement