Socket

本文介绍了Socket的基本概念,强调其作为进程间通信接口的角色,特别是在Linux系统下如何将Socket视为文件并使用文件描述符进行操作。内容涵盖Socket在内核中的层次结构,以及Linux中创建和管理Socket的过程,包括如何在进程控制块中管理和使用文件描述符。

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

相关文章:
tcp/ip详解卷一(笔记1:概述与IP层协议)
tcp/ip详解卷一(笔记2:UDP及相关的协议)
tcp/ip详解卷一(笔记3:tcp与相关协议)
tcp/ip详解卷一(笔记4:应用层应用与协议)

参考文献:
https://www.cnblogs.com/feng9exe/p/6994637.html
http://www.cnblogs.com/web21/p/6520164.html
https://blog.youkuaiyun.com/houjixin/article/details/51923919

1 简介

插口层的主要功能是将进程发送的与协议有关的请求映射到产生插口时指定的与协议有关的实现。(将请求和 具体的协议进行映射,具体映射的协议是在创建插口时指定的)。为了允许标准的Unix I/O系统调用(如read/write)也能读写网络连接,在BSD版本中将文件系统和网络功能集成在系统调用级(即文件系统和网络功能 属于系统调用,在操作系统内核中实现)与通过一个文件描述符来访问打开的文件一样,进程也是通过一个描述符来访问插口上的网络连接。这个特点使得标准的文件系统调用,如read/write ,以及与网络有关的系统调用,如sendmsg和recvmsg,都能够通过描述符来处理插口(即能像访问文件一样,使用标准的文件系统调用,使用插口描述符来访问网络)

进程中的插口与内核中的协议之间的实现之间的层次关系如下图所示。
在这里插入图片描述

在这里插入图片描述

2. linux 下的socket

在Linux中,socket 也是文件,用来对应的文件描述符。

在进程控制块PCB中包含当前进程中打开的文件列表


struct	proc {
      struct	proc *p_forw;		/* Doubly-linked run/sleep queue. */
	struct	proc *p_back;
	struct	proc *p_next;		/* Linked list of active procs */
	struct	proc **p_prev;		/*    and zombies. */
 
	/* substructures: */
	struct	pcred *p_cred;		/* Process owner's identity. */

      /* Ptr to open files structure. */
	struct	filedesc *p_fd;		

       //以下省略若干项
       .....
 }

其中,struct filedesc结构体描述了进程打开的所有的文件信息

当调用socket创建系统调用时,会调用函数get_unused_fd_flags(获取当前进程打开文件描述符表中的空闲描述符)和fd_install(安装新描述符到当前进程打开文件描述符表)

struct filedesc {
	struct	file **fd_ofiles;	/* file structures for open files */
	char	*fd_ofileflags;		/* per-process open file flags */


	struct	vnode *fd_cdir;		/* current directory */
	struct	vnode *fd_rdir;		/* root directory */
	int	fd_nfiles;		/* number of open files allocated */
	u_short	fd_lastfile;		/* high-water mark of fd_ofiles */
	u_short	fd_freefile;		/* approx. next free file */
	u_short	fd_cmask;		/* mask for file creation */
	u_short	fd_refcnt;		/* reference count */
};

这里需要重点关注该结构体的两个数组成员:struct file **fd_ofiles和char *fd_ofileflags(见上图)。其中:数组fd_ofiles的每个成员对应一个当前进程打开的文件结构体的地址;数组fd_ofileflags的每个成员对应当前进程打开的一个文件的描述符标志,文件描述符的标志采用bit位表示,因此一个打开的文件共有8个bit位表示8中不同的标志,例如标志close-on-exec和标志mapped-from-device。

结构体struct file表示当前进程中一个打开的文件,这里将关注其成员short f_type、struct fileops *f_ops和caddr_t f_data

在这里插入图片描述

在对socket进行read,write时,socket绑定的f_ops函数处理时,会根据socket中记录的类型调用相关的底层协议实现,完成相关的功能。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值