socket()函数的内部机制是什么?

高手

我正在尝试使用BlueZ HCI函数:

int hci_open_dev(int dev_id) {...}

在内部尝试创建这样的套接字:

socket(AF_BLUETOOTH, SOCK_RAW | SOCK_CLOEXEC, BTPROTO_HCI);

我试图了解socket()的Linux内核代码,但感到迷茫。

我想知道为给定域(AF_BLUETOOTH),数据传输类型(SOCK_RAW)和协议(BTPROTO_HCI)创建套接字的确切含义。

手册页仅说明它需要这些参数,创建一个套接字并返回设备描述符。

但是id喜欢了解创建套接字所涉及的确切情况以及内核的确切步骤。

编程序

这是一个非常广泛的描述(希望有助于理解主要方案的希望)。
内核开发人员可能会感到恐惧...

插座是用于许多不同的通信装置共同的抽象接口。
它提供了许多通用操作,例如关闭,发送/接收数据,设置/检索选项,这些操作几乎可以在任何类型的套接字上使用。

创建套接字意味着指定此通信方式的确切属性。
有点像实现接口的具体类型的实例化。

这些属性首先由协议系列组织; 这是socket()调用的第一个参数
例如:

  • PF_INET用于依赖IPv4的通信,
  • PF_INET6用于依赖IPv6的通信,
  • PF_LOCAL用于系统内部的进程间通信(管道种类),
  • PF_NETLINK用于与OS内核进行通信,
  • PF_PACKET用于与网络接口直接通信,
  • ...(其中有很多)

一旦选择了协议系列,则必须指定该系列提供的协议中要使用的协议。这是socket()调用的第二个参数
例如:

  • SOCK_DGRAM用于基于IPv4或IPv6的UDP,或用于PF_LOCAL中的不同消息,
  • SOCK_STREAM用于基于IPv4或IPv6的TCP或PF_LOCAL中的连续字节流,
  • SOCK_RAW,直接访问是家族中的原始基础协议(如果有)(例如IPv4或IPv6),
  • ...(每个家庭可以提供很多)

某些协议可以接受某些变体或某些限制。这是socket()调用的第三个参数
通常0就足够了,但是例如,我们可以找到:

  • PF_PACKET,SOCK_RAW,htons(ETH_P_ALL)捕获在网络接口上接收到的任何类型的网络数据包,
  • PF_PACKET,SOCK_RAW,htons(ETH_P_ARP)仅捕获ARP帧,

当我们要求使用这三个参数创建套接字时,操作系统将创建与该套接字句柄关联的内部资源。
当然,该资源的确切结构取决于所选的族/协议/变体,并且与特定于它的内核回调相关联。
每次(通过系统调用)在此套接字上调用操作时,都会调用特定的回调。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

Keras自定义损失函数访问python的全局变量时的内部机制是什么?

函数内部是什么?

对象方法(Javascript)内部的词法范围绑定的机制是什么?

机制是什么?

CPython中从C代码调用Python函数的机制是什么?

在Rust中将函数转换为特征的机制是什么?

purrr函数内部的点对点机制

/ *:* * /内部函数参数是什么意思?

C ++ lambda的机制是什么?

GIT合并的机制是什么?

Git的“替代机制”是什么?

内部负载平衡以及docker swarm v1.12的机制是什么

内置函数“ open”用于编码和解码文件名的机制是什么?

包含lambda表达式的函数背后的机制是什么?(蟒蛇)

tf.estimator.train_and_evaluate`函数控制训练和评估时间的机制是什么?

WorkManager的OneTimeWorkRequest的重试策略/机制是什么

在本地呈现网页的背后机制是什么?

此功能背后的机制是什么?

测试小程序的最佳机制是什么?

java和javac的机制是什么?

小型轮询机制的最佳算法是什么?

Redis中的快照机制是什么?

用gtest测试构造函数内部条件的方法是什么?

构造函数内部逻辑的最佳实践是什么?(Java)

DynamoDB中UUID的“内部哈希函数”是什么?

shared_ptr的控制块内部的虚函数是什么?

从成员函数内部永久更改类变量的方法是什么?

是什么机制可以防止同一blob多次触发横向扩展Azure函数触发器

什么是C局部函数声明机制?