如何实现以下场景?
我希望我的 FreeBSD 内核在高负载时丢弃 UDP 数据包。
我可以将sysctl
net.inet.udp.recvspace 设置为非常低的数字以丢弃数据包。但是我该如何实现这样的应用程序呢?
我假设我需要某种客户端/服务器应用程序。
任何指针表示赞赏。
ps 这不是作业。而且我不是在寻找确切的代码。我只是在寻找想法。
如何实现以下场景?
我希望我的 FreeBSD 内核在高负载时丢弃 UDP 数据包。
我可以将sysctl
net.inet.udp.recvspace 设置为非常低的数字以丢弃数据包。但是我该如何实现这样的应用程序呢?
我假设我需要某种客户端/服务器应用程序。
任何指针表示赞赏。
ps 这不是作业。而且我不是在寻找确切的代码。我只是在寻找想法。
它会自动执行此操作。你根本不需要做任何事情,更不用说摆弄内核参数了。
大多数关于 UDP 的帖子都在寻找阻止UDP 丢弃数据包的方法!
使用(SOL_SOCKET, SO_RCVBUF)
套接字选项通过setsockopt()
更改套接字缓冲区的大小。
调整发送应用程序以“丢弃”偶尔的数据包,或者如果不可能,则通过执行相同操作的代理连接 UDP 消息。
我要做的是执行以下操作。我不知道您是否需要内核模块或程序。
假设您在收到 UDP 数据报时有一个函数调用,然后您可以选择要做什么、丢弃它或处理它。并且进程函数可以触发多个线程。
EVER:
DATAGRAM := DEQUE()
IF(HIGHLOAD > LIMIT)
SEND(HIGH_LOAD_TO(DATAGRAM.SOURCE))
CONTINUE //Start from the biggining
HIGLOAD := HIGHLOAD + 1
PROCESS(DATAGRAM)
PROCESS(DATAGRAM):
...PROCESS DATAGRAM...
HIGHLOAD := HIGHLOAD - 1
你可以随心所欲地调整这个,但这是一个想法。当你开始处理一个包裹时,你计数,当这个过程完成时,你递减。所以你基本上可以选择你现在处理多少包。