我正在尝试使用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()
调用的第一个参数。
例如:
一旦选择了协议系列,则必须指定该系列提供的协议中要使用的协议。这是socket()
调用的第二个参数。
例如:
某些协议可以接受某些变体或某些限制。这是socket()
调用的第三个参数。
通常0
就足够了,但是例如,我们可以找到:
当我们要求使用这三个参数创建套接字时,操作系统将创建与该套接字句柄关联的内部资源。
当然,该资源的确切结构取决于所选的族/协议/变体,并且与特定于它的内核回调相关联。
每次(通过系统调用)在此套接字上调用操作时,都会调用特定的回调。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句