Proceso de comunicación de socket de programación de red

Proceso de comunicación

El proceso de comunicación TCP / socket se divide en cliente y servidor, que se presentan por separado a continuación.

Terminal de servicio

El lado del servidor es el papel de aceptar conexiones pasivamente, los pasos principales son los siguientes

  1. Crear un socket para monitorear socket ()
    -Monitor: monitorear conexiones con clientes
    -Socket: equivalente a un descriptor de archivo, el socket solo se usa para monitorear
  2. Vincular el descriptor del archivo de escucha con la IP y el puerto locales (la IP y el puerto son la información de la dirección del servidor) bind () El
    cliente se conecta al servidor utilizando esta IP y este puerto
  3. Configure el oyente y el oyente fd comienza a funcionar listen ()
  4. Bloqueo y espera, cuando un cliente inicia una conexión, se desbloquea, acepta la conexión del cliente y obtiene el socket para comunicarse con el cliente (fd) accept ()
    Cada vez que un cliente se comunica, se crea un nuevo socket
  5. Comunicación
    Recibir / enviar datos recv () enviar ()
  6. La comunicación ha terminado, desconecte la conexión cerrar ()

Cliente

El cliente suele iniciar una conexión de forma activa y existen los siguientes pasos

  1. Cree un socket para la comunicación (fd)
  2. Conéctese al servidor, especifique la IP y el puerto del servidor conectado
  3. La conexión es exitosa, la comunicación
  4. Fin de la comunicación, desconectar

Diagrama del proceso de comunicación

Los pasos de comunicación anteriores se pueden representar mediante un diagrama de proceso: el
Inserte la descripción de la imagen aquí
establecimiento de una conexión se refiere al proceso de negociación de tres vías. Para obtener más información, consulte la explicación detallada del protocolo TCP

Función de enchufe

Esta parte presenta la definición específica de cada función en la figura anterior. Todas las funciones se pueden ver a través del manual del hombre.
Archivos de encabezado para incluir:

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

O simplemente usa un archivo de encabezado

#include <arpa / inet.h>

Crear socket ()

La filosofía de Linux es que todo es un archivo. Socket no es una excepción, es un descriptor de archivo que se puede leer y escribir, controlar y cerrar.

int socket(int domain, int type, int protocol);

Función: Crear un conector
Parámetros:

  • dominio: familia de protocolos

    • AF_INET: ipv4
    • AF_INET6: ipv6
    • AF_UNIX, AF_LOCAL: comunicación de socket local
  • tipo: el tipo de protocolo utilizado en el proceso de comunicación

    • SOCK_STREAM: protocolo de transmisión
    • SOCK_DGRAM: protocolo de informe
  • protocolo: Un protocolo específico. Generalmente escribe 0

    • SOCK_STREAM: el protocolo de transmisión utiliza TCP de forma predeterminada
    • SOCK_DGRAM: el protocolo de informe usa UDP por defecto

valor de retorno:

  • Éxito: se devuelve el descriptor de archivo y se manipula el búfer del kernel.
  • Fallido: -1

Bind / name bind ()

La familia de direcciones se especifica cuando se crea el socket, pero no se especifica la dirección de socket específica que usa la familia de direcciones
. La vinculación de un socket a la dirección del socket se denomina nombrar el socket. En el programa del servidor, el socket generalmente se nombra, porque el cliente solo sabe cómo conectarse después de nombrarlo. El cliente no necesita nombrar el socket, pero usa la dirección del socket asignada automáticamente por el sistema operativo de forma anónima.

int bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen); // socket命名

bind asigna la dirección de socket apuntada por addr al descriptor de archivo sockfd sin nombre, y el parámetro addrlen indica la longitud de la dirección de socket

  • Función: enlazar, enlazar fd e IP + puerto local
  • parámetro:
    • sockfd: el descriptor de archivo obtenido a través de la función socket
    • addr: la dirección del socket que se enlazará, esta dirección encapsula la información de la ip y el número de puerto
    • addrlen: el tamaño de la memoria ocupada por la segunda estructura de parámetros

Escuchar()

int listen(int sockfd, int backlog); // /proc/sys/net/core/somaxconn
  • Función: monitorear la conexión en este enchufe
  • parámetro:
    • sockfd: el descriptor de archivo obtenido a través de la función socket ()
    • atrasos: el número máximo de enchufes desconectados y conectados

Aceptar conexión aceptar ()

int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);
  • Función: Recibe la conexión del cliente, el valor predeterminado es una función de bloqueo, bloqueando la espera de la conexión del cliente
  • parámetro:
    • sockfd: descriptor de archivo para monitoreo
    • addr: parámetro saliente, que registra la información de la dirección del cliente (ip, puerto) después de una conexión exitosa
    • addrlen: especifique el tamaño de memoria correspondiente del segundo parámetro
  • valor de retorno:
    • Éxito: descriptor de archivo utilizado para la comunicación
    • -1: fallido

Iniciar una conexión connect ()

int connect(int sockfd, const struct sockaddr *addr, socklen_t addrlen);
  • Función: el cliente se conecta al servidor
  • parámetro:
    • sockfd: descriptor de archivo utilizado para la comunicación
    • addr: la información de la dirección del servidor al que el cliente desea conectarse
    • addrlen: el tamaño de la memoria del segundo parámetro
  • Valor de retorno: éxito 0, error -1

Cerrar la conexión close ()

Cerrar la conexión es en realidad cerrar el
archivo de encabezado requerido por el socket correspondiente a la conexión :

#include <unistd.h>

int close(int fd);

fd es el socket que se va a cerrar La
llamada al sistema de cierre no se cierra inmediatamente, pero disminuye el recuento de referencia de fd en uno. Realmente cerca cuando la cuenta es 0

En un programa multiproceso, una llamada al sistema de bifurcación de forma predeterminada aumentará el recuento de referencias del socket abierto en el proceso principal en 1, por lo que la llamada de cierre debe realizarse en el socket tanto en el proceso principal como en el proceso secundario para cerrar la conexión

Supongo que te gusta

Origin blog.csdn.net/MinutkiBegut/article/details/114268072
Recomendado
Clasificación