socket()函数的内部机制是什么?
我正在尝试使用BlueZ HCI功能:socket()函数的内部机制是什么?,c,linux,sockets,linux-kernel,bluez,C,Linux,Sockets,Linux Kernel,Bluez,我正在尝试使用BlueZ HCI功能: int hci_open_dev(int dev_id) {...} 它在内部尝试创建如下套接字: socket(AF_BLUETOOTH, SOCK_RAW | SOCK_CLOEXEC, BTPROTO_HCI); 我试图理解socket()的linux内核代码,但感觉不知所措 我想知道为给定域(AF_蓝牙)、数据传输类型(SOCK_RAW)和协议(BTPROTO_HCI)创建套接字的确切含义 手册页只是声明它接受这些参数,创建一个套接字并返回一个
int hci_open_dev(int dev_id) {...}
它在内部尝试创建如下套接字:
socket(AF_BLUETOOTH, SOCK_RAW | SOCK_CLOEXEC, BTPROTO_HCI);
我试图理解socket()的linux内核代码,但感觉不知所措
我想知道为给定域(AF_蓝牙)、数据传输类型(SOCK_RAW)和协议(BTPROTO_HCI)创建套接字的确切含义
手册页只是声明它接受这些参数,创建一个套接字并返回一个设备描述符
但是我想了解创建套接字的具体过程和具体的内核步骤。这里有一个非常广泛的描述(希望有助于理解主方案)。
内核开发人员可能会感到震惊 套接字是许多不同通信方式的通用抽象接口。
它提供了许多通用操作,例如关闭、发送/接收数据、设置/检索选项,几乎可以在任何类型的套接字上使用 创建套接字意味着指定此通信方式的确切属性。
这有点像实现接口的具体类型的实例化 这些属性首先由协议族组织;这是
socket()
调用的第一个参数。例如:
- PF_INET用于依赖IPv4的通信
- PF_INET6用于依赖IPv6的通信
- PF_LOCAL用于系统内的进程间通信(管道类型)
- PF_NETLINK用于与操作系统内核通信
- PF_数据包用于与网络接口的直接通信
- 。。。(他们中有很多人)
socket()
调用的第二个参数。例如:
- SOCK_DGRAM用于IPv4或IPv6上的UDP,或PF_LOCAL中的不同消息
- SOCK_流用于IPv4或IPv6上的TCP,或PF_LOCAL中的连续字节流
- SOCK_RAW,access directly是该系列中的原始底层协议(如IPv4或IPv6)
- 。。。(每家每户都可以提供更多信息)
socket()
调用的第三个参数。通常
0
就足够了,但例如我们可以发现:
- PF_PACKET、SOCK_RAW、htons(ETH_P_ALL)用于捕获在网络接口上接收的任何类型的网络数据包
- PF_数据包、SOCK_RAW、htons(ETH_P_ARP)仅捕获ARP帧
当然,此资源的确切结构取决于所选的系列/协议/变体,并且它与特定于它的内核回调相关联。
每次在此套接字上调用中的操作(通过系统调用),都会调用特定的回调。这里有一个非常广泛的描述(希望有助于理解主方案)。
内核开发人员可能会感到震惊 套接字是许多不同通信方式的通用抽象接口。
它提供了许多通用操作,例如关闭、发送/接收数据、设置/检索选项,几乎可以在任何类型的套接字上使用 创建套接字意味着指定此通信方式的确切属性。
这有点像实现接口的具体类型的实例化 这些属性首先由协议族组织;这是
socket()
调用的第一个参数。例如:
- PF_INET用于依赖IPv4的通信
- PF_INET6用于依赖IPv6的通信
- PF_LOCAL用于系统内的进程间通信(管道类型)
- PF_NETLINK用于与操作系统内核通信
- PF_数据包用于与网络接口的直接通信
- 。。。(他们中有很多人)
socket()
调用的第二个参数。例如:
- SOCK_DGRAM用于IPv4或IPv6上的UDP,或PF_LOCAL中的不同消息
- SOCK_流用于IPv4或IPv6上的TCP,或PF_LOCAL中的连续字节流
- SOCK_RAW,access directly是该系列中的原始底层协议(如IPv4或IPv6)
- 。。。(每家每户都可以提供更多信息)
socket()
调用的第三个参数。通常
0
就足够了,但例如我们可以发现:
- PF_PACKET、SOCK_RAW、htons(ETH_P_ALL)用于捕获在网络接口上接收的任何类型的网络数据包
- PF_数据包、SOCK_RAW、htons(ETH_P_ARP)仅捕获ARP帧
当然,此资源的确切结构取决于所选的系列/协议/变体,并且它与特定于它的内核回调相关联。
每次在此套接字上调用中的操作(通过系统调用),都会调用特定的回调。请看这里:这是对Bluetooth堆栈的BlueZ Linux实现的一个很好的高级描述: 。具体来说,它为您提供了这些BlueZ内核驱动程序的良好概述:
- 布鲁托