Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
socket()函数的内部机制是什么?_C_Linux_Sockets_Linux Kernel_Bluez - Fatal编程技术网

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

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)创建套接字的确切含义 手册页只是声明它接受这些参数,创建一个套接字并返回一个

我正在尝试使用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)创建套接字的确切含义

手册页只是声明它接受这些参数,创建一个套接字并返回一个设备描述符


但是我想了解创建套接字的具体过程和具体的内核步骤。

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

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

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

这些属性首先由协议族组织;这是
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内核驱动程序的良好概述:

  • 布鲁托