Red de conocimiento informático - Aprendizaje de programación - La diferencia entre socket de Linux y estructura de calcetín

La diferencia entre socket de Linux y estructura de calcetín

//****************************************** ********************************

/* 1. Cada archivo abierto, Sockets y y así sucesivamente están representados por una estructura de datos de archivo, de modo que los archivos y sockets se distinguen por cada miembro en inode->u(union):

struct inode {

.. .. .......

union {

struct text2_inode_info ext2_i;

struct text3_inode_info text3_i

struct socket socket_i; /p>

.................................

} u }

2. Cada estructura de datos de socket tiene un miembro de estructura de datos de calcetín. El calcetín es una extensión del socket. Hay una correspondencia uno a uno entre los dos puntos socket->sk al calcetín correspondiente. ->socket

Apunta al socket correspondiente;

3. El socket y el calcetín son dos lados de la misma cosa. Esto se debe a que el socket es parte de la estructura del inodo, es decir, una unión dentro de la estructura del inodo se utiliza como estructura del socket.

Debido a las particularidades de las operaciones de socket, esta estructura de datos requiere una gran cantidad de componentes estructurales. Si todos estos componentes se colocan en la estructura del socket, la unión en la estructura del inodo se volverá muy grande. Como resultado, la estructura de inodo también será muy grande y, para otros sistemas de archivos, la unión no necesita ser tan grande.

Por lo tanto, provocará un gran desperdicio en la cantidad de estructuras de inodo utilizadas en el sistema. El número es mucho mayor que el de los sockets, por lo que la solución es dividir el socket en dos partes, colocar las que están estrechamente relacionadas con el sistema de archivos en la estructura del socket y colocar las que están estrechamente relacionadas con la comunicación en otra estructura separada.

*/

struct socket

{

socket_state state; // Este estado se utiliza para indicar el estado actual del socket

p>

typedef enum {

SS_FREE = 0, /* no asignado */

SS_UNCONNECTED, /* no conectado a ningún socket */

SS_CONNECTING , /* en proceso de conexión */

SS_CONNECTED, /* conectado al socket */

SS_DISCONNECTING /* en proceso de desconexión */

} socket_state ;

banderas largas sin firmar; // Los valores posibles de este miembro son los siguientes. Esta bandera se utiliza para establecer si el socket está ocupado

<. p>#define SOCK_ASYNC_NOSPACE 0

#define SOCK_ASYNC_WAITDATA 1

#define SOCK_NOSPACE 2

struct proto_ops *ops // El puntero de función de operación vinculado al específico familia de protocolos en el socket según el protocolo, como IPv4 TCP es inet_stream_ops

struct inode *inode; //Indica el inodo al que pertenece el socket

struct fasync_struct *fasync_list; //Cola de activación asincrónica

struct file *file; / /file back pointer

struct sock *sk; //sock pointer

wait_queue_head_t wait; //cola de espera de sock, duerme en esta cola cuando TCP necesita esperar

short type; //Indica el tipo de socket bajo una familia de protocolos específica, como SOCK_STREAM,

unsigned char passcred; //No es necesario considerarlo en el análisis de TCP

};