linux内核中加入钩子,关于C#:如何在Linux内核中注册UDP端口并为此端口范围创建钩子...

我是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堆栈更好。如果那不是您所需要的,则只需使用普通的套接字编程工具即可。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值