gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:25:57 25 4
gpt4 key购买 nike

我正在尝试使用 BlueZ HCI 功能:

int hci_open_dev(int dev_id) {...}

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

socket(AF_BLUETOOTH, SOCK_RAW | SOCK_CLOEXEC, BTPROTO_HCI);

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

我想知道为给定域 (AF_BLUETOOTH)、数据传输类型 (SOCK_RAW) 和协议(protocol) (BTPROTO_HCI) 创建套接字究竟意味着什么。

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

但我想了解到底发生了什么以及创建套接字所涉及的确切内核步骤。

最佳答案

这里是一个非常广泛的描述(希望有助于理解主要方案)。
内核开发人员可能会被吓坏了......

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

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

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

  • PF_INET 用于依赖 IPv4 的通信,
  • PF_INET6用于依赖IPv6的通信,
  • PF_LOCAL 用于系统内部的进程间通信(一种管道),
  • PF_NETLINK 用于与操作系统内核通信,
  • PF_PACKET 用于与网络接口(interface)的直接通信,
  • ...(存在很多)

一旦选择了一个协议(protocol)族,你必须指定,你想在这个族提供的协议(protocol)中使用哪个协议(protocol);这是 socket() 调用的第二个参数。
例如:

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

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

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

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

关于c - socket() 函数的内部机制是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57152408/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com