[英]Level-triggered or edge-triggered?
我有一個服務器應用程序,它監聽端口,接受(TCP)對等連接,然后為每個套接字
1) reads
(不超過30個字節的數據)
2) sends
(1字節ack)
3) reads
(不超過2K)
4) sends
(1字節確認)
5) closes
(連接)
我在我的應用程序中使用epoll
循環。 我希望epoll_wait
僅在所有數據從對等體到達時返回(帶有EPOLLIN標志的事件列表),以便我可以通過單個read/recv
調用read/recv
入數組。 如果在某個套接字fd上沒有收到所有數據,我不希望epoll
將此fd添加到事件列表中。
據我了解epoll
水平觸發和邊緣觸發模式之間的差異,可以使用帶有非阻塞套接字的邊緣觸發epoll
以及跟蹤步驟的有限狀態來達到這種行為。
如果邊緣觸發選項出錯,請糾正我。 任何的想法?
在epoll_wait
報告套接字准備好讀取之前,似乎無法設置傳入套接字緩沖區中可用的最小字節數。
男士插座(7) :
SO_RCVLOWAT和SO_SNDLOWAT
指定緩沖區中的最小字節數,直到套接字層將數據傳遞給協議(SO_SNDLOWAT)或接收用戶(SO_RCVLOWAT)。 這兩個值初始化為1.在Linux上,SO_SNDLOWAT不可更改(setsockopt(2)因ENAPROTOOPT錯誤而失敗)。 SO_RCVLOWAT僅在Linux 2.4之后才可更改。 select(2)和poll(2)系統調用當前不遵循Linux上的SO_RCVLOWAT設置,並且即使單個數據字節可用時也標記套接字可讀。 隨后從套接字讀取將阻塞,直到SO_RCVLOWAT字節可用。
除非手冊頁已過期。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.