欢迎访问 生活随笔!

生活随笔

当前位置: 首页 > 编程资源 > 编程问答 >内容正文

编程问答

2-5:套接字(Socket)编程之从内核角度深入理解套接字

发布时间:2025/3/15 编程问答 34 豆豆
生活随笔 收集整理的这篇文章主要介绍了 2-5:套接字(Socket)编程之从内核角度深入理解套接字 小编觉得挺不错的,现在分享给大家,帮大家做个参考.

文章目录


以TCP通信为例,创建套接字时使用的接口是socket,监听使用的listen,绑定使用的bind,不管怎样,他们都是系统调用接口。在Linux内核代码中,是通过call来区分的

其实,创建套接字的时候,在底层会首先创建一个内核结构,叫做struct socket

其中有两个非常重要的struct,分别是file和sock。file与文件有关,因为socket本质就是文件,而这是套接字,一定还要与网络相关,因此其内部还会有一个结构体是sock

如下是sock结构体

当然这里不止这么一种sock,还有很多种sock,例如tcp_sock,udp_sock,raw_sock

在sock中有两个结构体:

struct sk_buff_head sk_receive_queue;//接受的数据放入接受队列 struct sk_buff_head sk_write_queue;//用户层写入的数据放入该队列

当然如果你使用的是tcp,那么使用的sock就是tcp_sock

如果你使用的是udp,那么使用的sock就是udp_sock

大家可以看到无论是udp_sock还是tcp_sock,都必须保证“inet_sock has to be the first member ”
同时inet_sock里的第一个字段正是sock

整个过程实际有点绕,但是总结到下面这张图中就十分清晰了

结合前面说过的task_struct,访问时只要强转,也就是进行切片操作就可以完成任意结构体的访问了

在创建套接字时,会调用sock_map_fd,创建一个文件,然后分配文件描述符

然后再用sock_attach_fd,让文件和套接字产生关联

也就是下面这样

文件与套接字关系如下

总结

以上是生活随笔为你收集整理的2-5:套接字(Socket)编程之从内核角度深入理解套接字的全部内容,希望文章能够帮你解决所遇到的问题。

如果觉得生活随笔网站内容还不错,欢迎将生活随笔推荐给好友。