linux sock结构体,struct socket结构体详解

本文详细介绍了Linux内核中struct socket结构体的作用,它是进程与内核网络系统之间的桥梁。struct socket包含state、type、flags等字段,用于创建、管理和通信。文章还列举了不同类型和标志,如SOCK_STREAM、SOCK_DGRAM等,并解释了如何通过sock_create函数创建struct socket,以及bind、listen、accept、connect等操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在内核中为什么要有struct socket结构体呢?

struct socket结构体的作用是什么?

下面这个图,我觉得可以回答以上两个问题。  5de4df5d83a5be1ada1041fce104980b.png

由这个图可知,内核中的进程可以通过使用struct socket结构体来访问linux内核中的网络系统中的传输层、网络层、数据链路层。也可以说struct socket是内核中的进程与内核中的网路系统的桥梁。

struct socket

{

socket_state  state; // socket state

short   type ; // socket type

unsigned long  flags; // socket flags

struct fasync_struct  *fasync_list;

wait_queue_head_t wait;

struct file *file;

struct sock *sock;  // socket在网络层的表示;

const struct proto_ops *ops;

}

struct socket结构体的类型

enum sock_type

{

SOCK_STREAM = 1, // 用于与TCP层中的tcp协议数据的struct socket

SOCK_DGRAM  = 2, //用于与TCP层中的udp协议数据的struct socket

SOCK_RAW    = 3, // raw struct socket

SOCK_RDM    = 4, //可靠传输消息的struct socket

SOCK_SEQPACKET = 5,// sequential packet socket

SOCK_DCCP   = 6,

SOCK_PACKET = 10, //从dev level中获取数据包的socket

};

struct socket 中的flags字段取值:

#define SOCK_ASYNC_NOSPACE  0

#define SOCK_ASYNC_WAITDATA 1

#define SOCK_NOSPACE        2

#define SOCK_PASSCRED       3

#define SOCK_PASSSEC        4

我们知道在TCP层中使用两个协议:tcp协议和udp协议。而在将TCP层中的数据往下传输时,要使用网络层的协议,而网络层的协议很多,不同的网络使用不同的网络层协议。我们常用的因特网中,网络层使用的是IPV4和IPV6协议。

所以在内核中的进程在使用struct socket提取内核网络系统中的数据时,不光要指明struct socket的类型(用于说明是提取TCP层中tcp协议负载的数据,还是udp层负载的数据),还要指明网络层的协议类型(网络层的协议用于负载TCP层中的数据)。

linux内核中的网络系统中的网络层的协议,在linux中被称为address family(地址簇,通常以AF_XXX表示)或protocol family(协议簇,通常以PF_XXX表示)。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值