Programación de socket en Linux

  

La transferencia de datos de Network Socket es un tipo especial de E /S, Socket también es un descriptor de archivos. Socket también tiene una función llamada Socket () similar al archivo abierto. Esta función devuelve un descriptor entero de Socket. El establecimiento posterior de la conexión, la transferencia de datos y otras operaciones se implementan a través del Socket.

Lo que es una interfaz Socket Socket es una API para una red TCP /IP. La interfaz Socket define una serie de funciones o rutinas que los programadores pueden usar para desarrollar aplicaciones en una red TCP /IP. Para conocer la programación de la red TCP /IP en Internet, debe comprender la interfaz de Socket. El diseñador de la interfaz Socket primero colocó la interfaz en el sistema operativo Unix
. Si comprende la entrada y la salida de los sistemas Unix, es fácil comprender Socket. La transmisión de datos Socket de la red es un tipo especial de E /S, y Socket también es un descriptor de archivos. Socket también tiene una función llamada Socket () similar a la apertura de un archivo. Esta función devuelve un descriptor entero de Socket. El establecimiento posterior de la conexión, la transferencia de datos y otras operaciones se implementan a través del Socket. Hay dos tipos de sockets comúnmente utilizados: Socket de transmisión (SOCK_STREAM) y Socket de datagramas (SOCK_DGRAM). Streaming es un Socket orientado a la conexión para aplicaciones de servicio TCP orientado a la conexión; Datagram Socket es un Socket sin conexión que corresponde a una aplicación de servicio UDP sin conexión.

Socket Build Para crear un Socket, el programa puede llamar a la función Socket, que devuelve un identificador similar al descriptor de archivo. El prototipo de la función socket es: int socket (int domain, int type, int protocol); domain especifica la familia de protocolos a usar, generalmente PF_INET, que representa la familia de Protocolos de Internet (TCP /IP protocol family); el parámetro type especifica el tipo de socket: SOCK_STREAM O SOCK_DGRAM, la interfaz de Socket también define el Socket original (SOCK_RAW), lo que permite que el programa utilice el protocolo de capa inferior; el protocolo generalmente se asigna a " 0 ". La llamada Socket () devuelve un descriptor de socket entero que puede utilizar más adelante en la llamada. Un descriptor de socket es un puntero a una estructura de datos interna que apunta a la entrada de la tabla del descriptor. Cuando se llama a la función Socket, el ejecutable de socket creará un Socket. De hecho, "Crear un Socket" significa asignar espacio de almacenamiento para una estructura de datos de Socket. Socket Executor gestiona la tabla de descriptores por usted. Una conexión de red entre dos programas de red incluye cinco tipos de información: protocolo de comunicación, dirección de protocolo local, puerto de host local, dirección de host remoto y puerto de protocolo remoto. Estos cinco tipos de información se incluyen en la estructura de datos de Socket.

Configuración de zócalo Después de devolver un descriptor de zócalo a través de una llamada de zócalo, el zócalo debe configurarse antes de usar el zócalo para la transmisión de red. El cliente de socket orientado a la conexión guarda información local y remota en la estructura de datos de socket llamando a la función Connect. Los clientes y servidores sin sockets y sockets orientados al servidor configuran la información local llamando a la función de enlace. La función Bind asocia el socket con un puerto en la máquina, y luego puede escuchar las solicitudes de servicio en ese puerto. El prototipo de la función Bind es: int bind (int sockfd, struct sockaddr * my_addr, int addrlen); Sockfd es el descriptor de socket devuelto al llamar a la función socket, y my_addr es un tipo de sockaddr que contiene información como la dirección IP local y el número de puerto. Puntero; addrlen a menudo se establece en sizeof (struct sockaddr). El tipo de estructura struct sockaddr se utiliza para almacenar información de socket: struct sockaddr {uns_signed short sa_family; /* familia de direcciones, AF_xxx * /char sa_data [14]; /​​* dirección de protocolo de 14 bytes * /}; sa_family generalmente es AF_INET Representa la familia de direcciones de Internet (TCP /IP); sa_data contiene la dirección IP y el número de puerto del socket. También hay un tipo de estructura: struct sockaddr_in {short int sin_family; /* address family * /unsigned short int sin_port; /* número de puerto * /struct in_addr sin_addr; /* IP address * /unsigned char sin_zero [8]; /* Rellene 0 para mantener el mismo tamaño que struct sockaddr * /}; esta estructura es más cómoda de usar. Sin_zero se utiliza para llenar la estructura sockaddr_in con la misma longitud que struct sockaddr, que se puede establecer en cero con la función bzero () o memset (). Los punteros a sockaddr_in y los punteros a sockaddr se pueden convertir entre sí, lo que significa que si el tipo de parámetro requerido de una función es sockaddr, puede convertir un puntero a sockaddr_in en un puntero a sockaddr en el momento de la llamada de función, o viceversa. Al usar la función de enlace, puede usar la siguiente asignación para obtener automáticamente la dirección IP local y obtener aleatoriamente un número de puerto desocupado: my_addr.sin_port = 0; /* El sistema selecciona aleatoriamente un número de puerto no utilizado * /my_addr. Sin_addr.s_addr = INADDR_ANY; /* Complete la dirección IP local * /Al configurar my_addr.sin_port en 0, la función seleccionará automáticamente un puerto desocupado para que lo use. De manera similar, al configurar my_addr.sin_addr.s_addr en INADDR_ANY, el sistema completa automáticamente la dirección IP local. Tenga en cuenta que al usar la función de vinculación, debe convertir sin_port y sin_addr a byte de la red de primer orden; sin_addr no necesita convertir. El almacén de datos de la computadora tiene dos órdenes de prioridad de bytes: el primer byte primero y el byte bajo primero. Los datos en Internet se transmiten en la red en orden de bytes de alto orden. Por lo tanto, para las máquinas que almacenan datos internamente en prioridad de bytes de bajo orden, los datos deben convertirse cuando se transmiten datos en Internet, de lo contrario se producirá una inconsistencia de datos. Aquí hay algunas funciones de conversión de orden de bytes: · htonl (): Convierta los valores de 32 bits del orden de bytes del host al orden de bytes de la red · htons (): Convierta los valores de 16 bits del orden de bytes del host a la palabra de red Secciones · ntohl (): convertir valores de 32 bits del orden de bytes de la red al orden de bytes del host · ntohs (): conversión de valor de 16 bits del orden de bytes de la red al orden de bytes del host La función Bind () se realizó correctamente Devuelve 0 cuando se le llama; devuelve " -1 " cuando ocurre un error y establece errno en el número de error correspondiente. Se debe tener en cuenta que al llamar a la función de enlace, generalmente no establezca el número de puerto en un valor inferior a 1024. Dado que 1 a 1024 es el número de puerto reservado, puede seleccionar cualquier número de puerto que no esté ocupado por uno de 1024.

Conexión El establecimiento de un programa cliente orientado a la conexión utiliza la función Conectar para configurar el socket y establecer una conexión TCP con el servidor remoto. El prototipo de la función es: int connect (int sockfd, struct sockaddr * serv_addr, int addrlen); Sockfd El descriptor de socket es devuelto por la función socket; serv_addr es un puntero que contiene la dirección IP del host remoto y el número de puerto; addrlen es la longitud de la estructura geológica remota. La función Conectar devuelve -1 cuando se produce un error y establece errno en el código de error correspondiente. No hay necesidad de llamar a bind () para el diseño del programa cliente, porque en este caso, solo necesita conocer la dirección IP de la máquina de destino, y el puerto a través del cual el cliente se conecta al servidor no necesita preocuparse. El archivo ejecutable de socket selecciona automáticamente uno para su programa. Puerto ocupado y notificarle cuando los datos del programa están rotos.

Copyright © Conocimiento de Windows All Rights Reserved