![]() |
1
2
我不确定您是否需要内核中的原始套接字。在内核中,您可以添加一个netfilter钩子,或者注册其他东西(???)它将接收所有数据包;这可能是您想要的。 如果在内核中使用了原始套接字,那么可能需要有一个内核线程(即由内核线程启动)来调用read()。但是它不需要是内核线程,它可以是一个用户空间线程,它只是进行了一个特殊的系统调用或设备调用来调用所需的内核模式例程。 如果您注册了一个钩子,它调用的上下文可能是一些不应该做太多处理的内容;我不知道可能是什么,它可能是“下半部分处理程序”或“tasklet”,不管是什么(这些类型的控制结构不断从一个版本变为另一个版本)。我希望这不是一个真正的中断服务程序。 回答你原来的问题:
是的,您需要在单独的线程中执行此操作,不,它不会挂起系统。然而,在内核模式下进行系统调用是非常困难的,尽管它确实可以工作(有点)。 但是如果你安装了某种钩子,你就不需要这样做了。 |
![]() |
2
0
我认为您最好的选择可能是模仿驱动程序的编写方式,将您的服务器视为一个虚拟设备,位于请求所来自的设备之上。示例:鼠标驱动程序接受连续输入,但如果编程正确,则不会锁定系统,网络适配器可能更类似于您的情况。 |
![]() |
Ian Newson · 协议缓冲区、C#和网络流:永远不会收到消息 3 年前 |
![]() |
Evantoki Alfa · 线程“main”java中出现异常。lang.ArrayIndexOutOfBoundsException:演示时为0。查找。main(Lookup.java:19) 3 年前 |
![]() |
ê¹ì¼í · 如何发送带有引号的关键数据的POST方法? 3 年前 |
![]() |
TiDu · 使用EKS设置出口网关的最简单方法,无需Istio 3 年前 |
![]() |
Nop · 无法关闭键盘中断(Python)上的套接字连接 3 年前 |