Enchufe para programación de red

Cliente TCP:
1. Establezca el zócalo de conexión, configure la supervisión de puertos e IP, zócalo ()
2. Establezca la conexión
3. escriba () Obtenga datos de flujo de red y envíe datos
4.read () Adquiera datos de flujo de red y reciba datos
5. Cerrar zócalo

Servidor TCP
1. Establezca un puerto de escucha de puerto ()
2. Enlace el enlace de puerto especificado ()
3. Escuche la supervisión del puerto
4. Acepte el bloqueo () hasta que haya un acceso de cliente
5. Lea () para obtener los datos enviados por el cliente
6. write () envía datos de retorno
7.close cierra la
Inserte la descripción de la imagen aquí
llamada de función de escucha de puerto requerida por el servidor para establecer una conexión con el cliente

1. función de
socket función de socket para establecer un socket socket

int socket(int family, int type, int protocol);
返回值:成功返回非负描述符,若出错返回 -1;

int family:协议族 (socket 函数的family常值包括:
 AF_INET, AF_INET6, AF_LOCAL, AF_ROUTE, AF_KEY.

int type:套接字类型(SOCK_STREAM, SOCK_DGRAM, SOCK_SEQPACKET, SOCK_RAM)

int protocol:协议类型(IPPROTO_TCP, IPPROTO_UDP, IPPROTO_SCTP

(1) No todas las combinaciones de familia y tipo son válidas, por lo que el parámetro de protocolo generalmente se establece en 0 para permitir que el núcleo coincida automáticamente con el tipo de protocolo para evitar errores.
(2) Dirección de la familia AF_XXX. Familia de protocolos PF_XXX.
(3) La especificación POSIX especifica que el primer parámetro de la función del socket es el valor PF_, y el valor AF_ se usa para la estructura de la dirección del socket.

2.función de
conexión El cliente TCP usa la función de conexión para establecer la conexión con el servidor TCP

int connect(int sockfd, const struct sockaddr *servaddr, socklen_t addrlen); 
返回值:  成功返回 0 ,出错返回 -1。

int sockfd: socket函数返回的套接字描述符。

const struct *servaddr: 指向套接字地址结构的指针。

socklen_t addrlen: 套接字地址结构的的大小。

(1) La estructura de dirección de socket aprobada debe contener la dirección IP y el número de puerto del servidor.
(2) El cliente no tiene que llamar a la función de enlace al llamar a connect. Si es necesario, el núcleo determinará la dirección IP de origen y seleccionará un puerto temporal como puerto de origen.
(3) La función de conexión estimulará el proceso de protocolo de enlace de tres vías de TCP.
(4) Varias situaciones cuando connect vuelve con error:

  • Si el cliente TCP no recibe una respuesta de la sección SYN dentro del tiempo especificado, devuelve un error ETIMEOUT
  • Si la respuesta al SYN del cliente es RST (se restablece la conexión de la otra parte), significa que el host del servidor no tiene procesos esperando para conectarse en el puerto que especificamos. Este es un error grave y el cliente devuelve un error ECONNREFUSED tan pronto como recibe el RST. Las tres condiciones para generar el segmento RST son: el destino es un SYN de un puerto, pero no hay ningún servidor escuchando en ese puerto; TCP quiere cancelar una conexión existente; TCP recibe un segmento en una conexión que no existe en absoluto Festival
  • Si el SYN emitido por el cliente desencadena un error ICMP "destino inalcanzable" en un enrutador intermedio, se considera un error de software y el cliente guarda el mensaje en el núcleo. Y continúe enviando SYN en un intervalo de tiempo determinado, dentro del tiempo especificado no ha recibido una respuesta. El mensaje guardado se devuelve al proceso como un error EHOSTUNREACH (el error ENETUNREACH está desactualizado ENETUNREACH tratado como EHOSTUNREACH).

(5) Si la llamada de conexión falla, el descriptor de socket ya no se puede usar y debe cerrarse

3. La función de
vinculación de la función de vinculación asigna una dirección de protocolo local a un socket. Para el protocolo TCP / IP, la dirección de protocolo es la combinación de la dirección IP y el número de puerto.

int bind(int sockfd, cosnt struct sockaddr *myaddr, socklen_t addrlen);
返回值:成功返回0,出错返回 -1

int sockfd: 由socket函数返回的套接字描述符。

const struct sockaddr *myaddr: 指向特定于协议的套接字地址结构的指针。

socklen_t : 套接字地址结构的大小。

La operación de enlace involucra tres objetos: socket, dirección y puerto. El socket es objeto de enlace, y la dirección y el puerto son los objetos vinculados al socket.
(1) La función de enlace se puede utilizar para especificar tanto la dirección IP como el número de puerto, o solo la dirección IP o el número de puerto.
(2) Excepto para el servidor RPC (que usa el mapeador de puertos), todos los demás servidores necesitan llamar a bind para vincular al menos su número de puerto de servicio.
(3) Si el programa cliente no necesita especificar un número de puerto específico, entonces el programa cliente generalmente no llama a la función de vinculación, el núcleo asignará una dirección IP y un número de puerto para el programa cliente.
(4) Si llama a la función de vinculación para vincular una dirección IP que pertenece a una interfaz de la máquina al zócalo: para el programa cliente, esta dirección IP es la dirección IP de origen del datagrama enviado. Para el servidor, restringe el servidor para que solo reciba conexiones de programas cliente destinados a esta dirección IP.
(5) Si se utiliza la dirección a vincular, la vinculación devuelve un error EADDRINUSE.
(6) La función de vinculación no devuelve la dirección IP vinculada y el número de puerto. Puede obtener esta información llamando a getsockname.
(7) enlazar enlaza diferentes IP para diferentes servidores, puede ejecutar múltiples copias de servidor en la misma máquina multi-hospedada, y cada copia sirve a un cliente específico.
(8) Interfaz de llegada del paquete y dirección IP de destino del paquete, modelo de sistema fuerte y sistema débil

4. La función de escuchar la función de
escuchar solo es invocada por el servidor TCP.

int listen(int sockfd, int backlog);返回值:成功返回0 出错返回 -1。

int sockfd: socket 函数返回的套接字描述符。

int backlog: 已连接套接字的已完成连接的最大排队数。

(1) La función de escucha convierte un socket no conectado en un socket pasivo, indicando al kernel que acepte las solicitudes de conexión dirigidas al socket.
(2) El núcleo mantiene dos colas para cada socket de escucha: cola de conexión completa (cola de conexión incompleta) y cola de conexión incompleta (cola de conexión completa).
(3) Cola de conexión incompleta: el SYN del cliente ha llegado al servidor y el servidor está esperando que se complete el protocolo de enlace de tres vías. Dicha conexión se coloca en la cola de conexión incompleta y el socket está en el estado SYN_RCVD.
(4) Cola de conexión completada: las conexiones de enlace de tres vías que se han completado con éxito se colocan en la cola de conexión completada. El zócalo está en estado ESTABLECIDO.
(5) El parámetro de acumulación especifica el número máximo de conexiones completadas en cola por el núcleo en un socket dado.
(6) El propósito de limitar el número de conexiones completadas es evitar que el núcleo continúe aceptando nuevas Solicitud de conexión.
(7) El núcleo maneja una gran cantidad de colas de conexión pendientes.
(8) Cuando la cola está llena, si el SYN de un nuevo cliente llega a TCP, el SYN se ignora y generalmente no se devuelve ningún mensaje de error.

5. función de aceptación El
servidor TCP llama a la función de aceptación para devolver la próxima conexión completa desde el encabezado de la cola de conexión completada. Si la cola de conexión completa está vacía, el proceso se suspenderá (si el socket es el método de bloqueo predeterminado) )

int accept(int sockfd,struct sockaddr *cliaddr, socklen_t *addrlen);
返回值:成功返回非负的描述符,出错返回 -1。

int sockfd : 一个监听套接字。

struct sockaddr *cliaddr : 套接字地址结构的指针,用来返回已连接的对端进程的协议地址。

socklen_t *addrlen: 函数调用的时候是传入的套接字地址结构的大小,函数返回时它的值是内核存放在该套接字地址结构中的确切字节数。

(1) Si aceptar devuelve con éxito, generará un nuevo socket, llamado socket conectado, que se utiliza para transferir datos con el cliente.
(2) Un servidor generalmente solo crea un socket de escucha (socket de escucha), que existe para todo el ciclo de vida del servidor.
(3) El núcleo crea un socket conectado para cada conexión de cliente aceptada por el proceso del servidor. Cuando el servidor completa el servicio a un cliente, el socket correspondiente se cerrará.
(4) La función de aceptación devuelve hasta tres valores: uno puede ser un nuevo descriptor de socket o un número entero indicado por el error, la dirección del protocolo del proceso del cliente y el tamaño de la dirección.

6. read (), write () y otras funciones Hasta
ahora, el servidor y el cliente han establecido una conexión. Puede llamar a la red de E / S para operaciones de lectura y escritura, es decir, para lograr la comunicación entre los diferentes procesos en la red.

La función de lectura es responsable de leer el contenido de fd. Cuando la lectura es exitosa, read devuelve el número real de bytes leídos. Si el valor devuelto es 0, significa que se ha leído el final del archivo. Si el error es EINTR, la lectura es causada por una interrupción. Si es ECONNREST, hay un problema con la conexión de red.

La función de escritura escribe el contenido de nbytes bytes en buf en el descriptor de archivo fd. Cuando tiene éxito, devuelve el número de bytes escritos. En caso de fallo, devuelve -1 y establece la variable errno. En los programas de red, hay dos posibilidades cuando escribimos en el descriptor del archivo de socket. 1) El valor de retorno de escritura es mayor que 0, lo que indica que parte o la totalidad de los datos se han escrito. 2) El valor devuelto es menor que 0 y se ha producido un error en este momento. Tenemos que tratarlo de acuerdo con el tipo de error. Si el error es EINTR, se produjo un error de interrupción durante la escritura. Si es EPIPE, hay un problema con la conexión de red (la otra parte ha cerrado la conexión).

7. función close ()
Después de que el servidor establece una conexión con el cliente, realizará algunas operaciones de lectura y escritura. Después de completar las operaciones de lectura y escritura, se cerrará el descriptor de socket correspondiente. Es como llamar a fclose para cerrar el archivo abierto después de la operación.

int close(int fd);
close一个TCP socket的缺省行为时把该socket标记为以关闭,
然后立即返回到调用进程。该描述字不能再由调用进程使用,
也就是说不能再作为read或write的第一个参数。

Nota: La operación de cierre solo hace el recuento de referencia del descriptor de socket correspondiente -1. Solo cuando el recuento de referencia es 0, el cliente TCP se activará para enviar una solicitud de terminación de conexión al servidor.

162 artículos originales publicados · elogiados 58 · 90,000 visitas

Supongo que te gusta

Origin blog.csdn.net/ThreeAspects/article/details/105570390
Recomendado
Clasificación