我是 Linux 内核的新手。我正在编写内核模块,这个模块处理多个 UDP 语音流。对于这个模块,我想在内核中注册多个不同语音流的UDP端口,这样其他UDP流量就无法使用这些UDP端口。根据我的理解,创建套接字和绑定(bind)是一种方法。
我还想为这些UDP语音端口创建一个钩子(Hook)函数,这样无论何时接收到语音数据包都会调用我的钩子(Hook)函数。
我有几个问题:
- 除了创建套接字并绑定(bind)它之外,是否有更好的方法在 Linux 内核中注册多个 UDP 端口?
- 如何创建一个钩子(Hook)函数,并为这些注册的多个UDP语音端口调用它?
最佳答案
简短的回答是:如果你不得不问,那么你不应该问。
这是更长的版本:
TCP/IP 编程是 API 面向使用它的用户空间的领域之一。结果是没有简单的方法从内核创建 TCP/IP(包括 UDP)套接字。
即使您管理了它,您也会发现您拥有的 API 不适合。当您使用它时,代码将尝试操纵用户空间内存、用户空间通知等。
一个足够有经验的内核开发人员可能会成功。然而,必须去 Stack Overflow 才能入门的人可能经验不足。
这让我们回到最初的问题:你为什么要在内核中编写这样的代码? IP 语音是一种复杂的协议(protocol)。在内核中调试代码比调试用户空间代码要难得多,更不用说出现问题时的错误恢复了。
如果您正在编写绝对必须具有高性能和低延迟的代码,我建议您考虑将您的解决方案基于纯用户空间(即 - 根本没有内核)。
这样的解决方案是DPDK .它允许您将网络数据包直接接收到用户空间缓冲区中。不幸的是,这也不是为初学者设计的解决方案。由于不涉及内核,因此该接口(interface)必须专用于 DPDK。这也意味着您必须编写自己的 UDP 堆栈来支持它。
DPDK 不是一个简单易用的工具,但如果您必须拥有绝对最高的带宽和绝对最低的延迟,它就是最好的解决方案。可能比在内核中编写整个 VoIP 堆栈要好。如果这不是您所需要的,那么只需使用普通的套接字编程工具即可。
关于c - 如何在 Linux 内核中注册 UDP 端口并为此端口范围创建 Hook ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46665895/