我是Linux内核的新手。 我正在编写内核模块,该模块处理多个UDP语音流。 对于此模块,我想在内核中注册具有不同语音流的多个UDP端口,以便其他UDP通信无法使用这些UDP端口。 根据我的理解,创建套接字和绑定是一种方法。
我还想为这些UDP语音端口创建一个挂钩函数,以便每当收到语音数据包时,它将调用我的挂钩函数。
我有几个问题:
除了创建套接字并绑定它以外,还有什么更好的方法可以在Linux内核中注册多个UDP端口?
如何创建一个挂钩函数,并为这些已注册的多个UDP语音端口调用它?
我不得不问-为什么在内核中这样做?
@ShacharShemesh:如果您没有要求,我会的。 在我看来,这是一个XY问题。
您应该针对特定问题询问特定问题。 由于Stack Overflow会向您隐藏"关闭"原因:"请编辑问题以将其限制为一个特定的问题,其详细程度足以确定适当的答案。避免一次提出多个不同的问题。请参阅"如何提出问题"页面,以帮助您弄清该问题。 。"
@ ShacharShemesh:对于造成的误会,我深表歉意。 我正在编写在内核空间中运行的Linux模块。 在内核中,我只想为这些UDP语音数据包创建钩子。 这样,只要语音数据包带有这些UDP端口,它就会将其发送到我的模块。
我的问题是,为什么它必须是内核模块。
简短的答案是:如果您必须要问,那您就不应该这样做。
这是更长的版本:
TCP / IP编程是API面向使用它的用户空间的领域之一。结果是没有简单的方法可以从内核创建TCP / IP(包括UDP)套接字。
即使您进行了管理,也会发现自己不适合使用的API。该代码将在您使用时尝试操纵用户空间内存,用户空间通知等。
经验丰富的内核开发人员可能可以将其付诸实践。但是,必须去Stack Overflow才能上手的人可能经验不足。
这使我们回到了最初的问题:您为什么仍要在内核中编写这样的代码? IP语音是一个复杂的协议。与调试用户空间代码相比,在内核中调试代码要困难得多,更不用说在出错时进行错误恢复了。
如果您要编写绝对必须具有高性能和低延迟的代码,建议您基于纯用户空间(即-根本没有内核)来考虑解决方案。
这样的解决方案就是DPDK。它使您可以将网络数据包直接接收到用户空间缓冲区中。不幸的是,这也不是为初学者设计的解决方案。由于不涉及内核,因此该接口必须专用于DPDK。这也意味着您必须编写自己的UDP堆栈来支持它。
DPDK不是简单易用的工具,但是如果您必须具有绝对最高的带宽和绝对最低的延迟,则它是最佳的解决方案。可能比在内核中编写整个VoIP堆栈更好。如果那不是您所需要的,则只需使用普通的套接字编程工具即可。