如何实现以下场景?执行:udp接收队列丢包
我想我的FreeBSD内核在高负载下丢弃UDP数据包。
我可以将sysctl
net.inet.udp.recvspace设置为很小的数字来丢弃数据包。但是,我如何实现这样的应用程序?
我假设我需要某种客户端/服务器应用程序。
任何指针表示赞赏。
p.s.这是不是作业。而我不是寻找确切的代码。我只想找想法。
如何实现以下场景?执行:udp接收队列丢包
我想我的FreeBSD内核在高负载下丢弃UDP数据包。
我可以将sysctl
net.inet.udp.recvspace设置为很小的数字来丢弃数据包。但是,我如何实现这样的应用程序?
我假设我需要某种客户端/服务器应用程序。
任何指针表示赞赏。
p.s.这是不是作业。而我不是寻找确切的代码。我只想找想法。
它会自动做到这一点。你根本不需要做任何事情,更不用说弄弄内核参数了。
大多数发布UDP的人都在寻找方法stop UDP丢弃数据包!
无论是调整发送应用程序以'删除'ocasional数据包,或者,如果不可能,通过执行相同的事情的代理连接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
你可以唠叨这个,你怎么想,但是一个想法。当你开始处理一个pakcage时,你会计数,当这个过程完成时,你减少。所以你基本上可以选择你现在处理多少包。
使用通过setsockopt()
的(SOL_SOCKET, SO_RCVBUF)
插座选项来更改插座的尺寸缓冲区。
哈哈!我知道。我想看到它失败,然后用net.inet.udp.recvspace修复。 – hari
@hari所以在短时间内发送大量数据报... – EJP