簡體   English   中英

水平觸發或邊緣觸發?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM