[Programación de red] Resumen de funciones de uso común

Formato de socket

Formato de enchufe universal

/* 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 */
  }; 

Formato de dirección 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];
  };

Formato de dirección 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 */
  };

Formato de dirección de socket local

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

API de socket común

socket crear 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
*/

enlace de enlace y dirección de conector

Función: enlaza los parámetros sockfd y addr juntos, de modo que sockfd, el descriptor de archivo para la comunicación de red, escuche la dirección y el número de puerto descritos por addr. struct sockaddr * es un tipo de puntero universal. El parámetro addr puede aceptar estructuras sockaddr de múltiples protocolos, y sus longitudes son diferentes, por lo que se requiere el tercer parámetro addrlen para especificar la longitud de la estructura.

#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);

escuchar convierte socket activo en socket pasivo

Rol: Un programa de servidor típico puede servir a varios clientes al mismo tiempo. Cuando un cliente inicia una conexión, el servidor acepta () devuelve y acepta la conexión. Si un gran número de clientes inicia una conexión y el servidor no tiene tiempo para procesarla, aún no ha aceptado El cliente está en el estado de espera de la conexión, listen () declara que sockfd está en el estado de escucha y, como máximo, los clientes atrasados ​​pueden estar en el estado de espera de la conexión. Si se reciben más solicitudes de conexión, se ignoran. listen () devuelve 0 en caso de éxito y -1 en caso de error.

#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
*/

aceptar para aceptar la conexión

Función: Después de completar el protocolo de enlace de tres vías, el servidor llama a accept () para aceptar la conexión. Si no hay una solicitud de conexión del cliente cuando el servidor llama a accept (), bloquea y espera hasta que un cliente se conecta. addr es un parámetro saliente, y la dirección y el número de puerto del cliente se transmiten cuando se acepta accept (). El parámetro addrlen es un parámetro entrante y saliente (argumento de valor-resultado). La longitud entrante de la dirección del búfer proporcionada por la persona que llama se utiliza para evitar el desbordamiento del búfer. La longitud saliente es la longitud real de la estructura de dirección del cliente. Es posible que no llene el búfer proporcionado por la persona que llama). Si se pasa NULL al parámetro addr, significa que la dirección del cliente no está relacionada.

#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
*/

El todo es un ciclo while, cada ciclo procesa una conexión de cliente. Como cliaddr_len es un parámetro entrante y saliente, el valor inicial debe reasignarse antes de cada llamada accept (). El parámetro listenfd de accept () es el descriptor de archivo anterior, y el valor de retorno de accept () es otro descriptor de archivo connfd. Después de eso, se comunica con el cliente a través de este connfd, y finalmente cierra connfd para desconectarse sin Cierre listenfd y regrese al comienzo del ciclo nuevamente. Listenfd todavía se usa como el parámetro de aceptación. accept () devuelve un descriptor de archivo en caso de éxito y -1 en caso de error.

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

conectar

El cliente necesita llamar a connect () para conectarse al servidor. Los parámetros de connect y bind son los mismos. La diferencia es que el parámetro de bind es su propia dirección, y el parámetro de connect es la dirección de la otra parte. connect () devuelve 0 en caso de éxito y -1 en caso de error.

#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
*/

Supongo que te gusta

Origin www.cnblogs.com/Trevo/p/12615848.html
Recomendado
Clasificación