详细介绍struct sock结构体
时间: 2023-11-12 19:09:17 浏览: 48
`struct sock` 是 Linux 内核网络协议栈中的一个非常重要的结构体,它表示一个通用的套接字(socket)。它的定义在 `<linux/net.h>` 中。
下面是 `struct sock` 的定义:
```c
struct sock {
/* Socket state: SS_CONNECTED, SS_DISCONNECTING etc */
unsigned short sk_state;
/* Protocol family, AF_xxx */
unsigned short sk_family;
/* One of SOCK_{STREAM,DGRAM,RAW,..} */
unsigned short sk_type;
/* Protocol, usually IPPROTO_TCP, IPPROTO_UDP */
unsigned short sk_protocol;
/* Socket table entry */
struct sock *sk_next;
struct sock *sk_prev;
struct sock *sk_acceptq;
/* Wait queue head for reading */
struct wait_queue_head sk_wq;
/* Receive queue */
struct sk_buff_head sk_receive_queue;
/* Send queue */
struct sk_buff_head sk_write_queue;
/* Socket error queue */
struct sk_buff_head sk_error_queue;
/* Head of queue of sockets waiting for send space */
struct sk_buff_head sk_backlog;
/* Socket buffer space */
unsigned int sk_sndbuf;
unsigned int sk_rcvbuf;
/* Memory pressure on skbs */
unsigned int sk_wmem_alloc;
unsigned int sk_rmem_alloc;
/* Socket callback functions */
void (*sk_data_ready)(struct sock *sk, int bytes);
void (*sk_write_space)(struct sock *sk);
void (*sk_error_report)(struct sock *sk);
/* Private socket data, e.g. TCP sock has tx/rx queues */
struct sk_buff_head sk_backlog_tail;
void *sk_protinfo;
/* Socket creation time */
unsigned long sk_tsq_flags;
struct timer_list sk_timer;
/* Socket options */
struct sk_options sk_options;
/* Misc flags */
unsigned int sk_flags;
/* Socket priority */
unsigned short sk_priority;
/* Socket multicast options */
struct ip_mreqn sk_omreq;
struct ip_mreqn sk_imreq;
/* Socket reference count */
atomic_t sk_refcnt;
/* Socket user ref count */
atomic_t sk_wmem_refcnt;
/* Socket lock */
spinlock_t sk_lock;
/* Socket destructor */
void (*sk_destruct)(struct sock *sk);
};
```
下面是对其中一些字段的解释:
- `sk_state`:表示 socket 的状态,例如 `SS_CONNECTED` 表示连接已经建立,`SS_DISCONNECTING` 表示正在断开连接等。
- `sk_family`:表示 socket 的协议族,例如 `AF_INET` 表示 IPv4 协议族,`AF_INET6` 表示 IPv6 协议族等。
- `sk_type`:表示 socket 的类型,例如 `SOCK_STREAM` 表示流式 socket,`SOCK_DGRAM` 表示数据报式 socket 等。
- `sk_protocol`:表示 socket 的协议,例如 `IPPROTO_TCP` 表示使用 TCP 协议,`IPPROTO_UDP` 表示使用 UDP 协议等。
- `sk_next` 和 `sk_prev`:表示一个 socket 链表中的下一个和上一个 socket。
- `sk_acceptq`:表示等待 accept 的 socket 队列。
- `sk_wq`:表示等待读取数据的进程队列。
- `sk_receive_queue`:表示接收到的数据的队列。
- `sk_write_queue`:表示等待发送的数据的队列。
- `sk_error_queue`:表示错误消息的队列。
- `sk_backlog`:表示等待发送的数据的队列。
- `sk_sndbuf` 和 `sk_rcvbuf`:表示发送和接收缓冲区的大小。
- `sk_data_ready`、`sk_write_space` 和 `sk_error_report`:表示 socket 的回调函数。
- `sk_protinfo`:表示私有数据,例如 TCP socket 的 tx/rx 队列。
- `sk_flags`:表示 socket 的标志,例如 `SOCK_NOSPACE` 表示没有足够的空间来发送数据等。
- `sk_priority`:表示 socket 的优先级。
- `sk_refcnt` 和 `sk_wmem_refcnt`:表示 socket 的引用计数。
- `sk_lock`:表示 socket 的锁。
- `sk_destruct`:表示 socket 的析构函数。
总之,`struct sock` 是 Linux 内核网络协议栈中非常重要的一个结构体,它包含了 socket 的各种信息和状态,是网络编程中一个重要的概念。