如何實現以下場景?執行: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