問(wèn): 服務(wù)端用epoll 模型 捕透, 客戶端連接服務(wù)端發(fā)送大量udp 數(shù)據(jù)包, 經(jīng)過(guò)一段時(shí)間后卒暂, 再次發(fā)送udp 數(shù)據(jù)包時(shí),服務(wù)端收不到包娄帖,(或者說(shuō)大量tcp連接服務(wù)端也祠,服務(wù)端會(huì)丟失連接),為何近速?
答:1. 在服務(wù)端诈嘿,用 ss -lu 查看 對(duì)應(yīng)進(jìn)程的recv-Q 是否占滿
image.png
當(dāng) Recv-Q 可以理解為 對(duì)應(yīng)進(jìn)程socket 的接收緩存隊(duì)列堪旧,系統(tǒng)維護(hù),如果占滿奖亚,系統(tǒng)會(huì)丟棄數(shù)據(jù)包淳梦。 可dmesg 查看相應(yīng)系統(tǒng)日志。
- 將epoll 模型的接收觸發(fā)方式改為 低電平觸發(fā)(水平觸發(fā)) 昔字, 即epoll 模型的默認(rèn)觸發(fā)方式爆袍。
struct epoll_event ev;
ev.events= EPOLLIN;
epoll 模型有兩種觸發(fā)方式:
一種叫好比拉尿,拉尿的時(shí)候都是一次拉完作郭,只要膀胱中還有尿陨囊,就一直拉。這就是epoll 模型中的EPOLLLT (水平觸發(fā))模式夹攒,只要緩沖區(qū)里有數(shù)據(jù)蜘醋,就一直觸發(fā),(應(yīng)用)趕快處理咏尝。
一種叫拉屎压语, 你完全可以拉到一半,然后提褲子走人编检,去接個(gè)電話胎食。過(guò)一會(huì)兒,可能又有了拉屎的欲望允懂, 再去拉屎厕怜。這就是epoll 模型中的EPOLLET(邊沿觸發(fā))模式,當(dāng)兩個(gè)網(wǎng)絡(luò)包同時(shí)到達(dá)時(shí)累驮,只觸發(fā)一次酣倾。