c - 如何在 Linux 内核中注册 UDP 端口并为此端口范围创建 Hook

标签 c linux sockets networking linux-kernel

我是 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/

相关文章:

linux - 在可运行的 jar 中停止子线程

linux - 在 ubuntu 上运行汇编代码

sockets - 如何保持连接以在不请求的情况下将实时数据发送到远程客户端

php - PHP 和 C++ 之间的安全套接字通信

c# - 如何在高度可靠的批量传输期间减少 TCP ACK 的数量

c - #define 多个元素用逗号分隔的语句

c - 将指针移交给 C 中的另一个函数

c - 在调用者的返回序列中跳过函数

C 编程 do while 与 switch case 程序

android - 如何在 Android 中使用 Linux 应用程序