EDIT:
實際上,接收SIGPIPE
是用於網絡連接的應用幾乎是 「正常」。
這與網絡操作的複雜性及其併發性有關。
例如,假設對方發送了所有數據並關閉了連接。在你的機器上,套接字應該仍然讀取毛刺中的所有數據(雖然試圖發送數據會引發錯誤)...
...此外,noPoll使用的事件循環可能會收到一個HUP
輪詢信息(遠程斷開/掛斷)並將其放入隊列中。同時,您的代碼可能仍在運行,或者它可能放置在事件隊列的較早位置。因此,在您的代碼運行時,連接數據尚未更新。
要在您的網絡應用程序中處理SIGPIPE
(如this question所示),您應該忽略信號或處理它(如果需要採取任何措施)。
通常人們在寫:
signal(SIGPIPE, SIG_IGN);
另一種方法可以使用更新的sigaction
系統調用:
/*設置信號處理*/ 結構sigaction的行爲,老,old_term,old_pipe; sigemptyset(& act.sa_mask); 行爲。sa_handler = SIG_IGN;如果(sigaction(SIGPIPE,& act,& old_pipe)){ perror(「could not set signal handler」); exit(errno); };
請記住,包括signal.h
#include <errno.h>
#include <signal.h>
在C++中的實現可能會略有不同,但這應該工作兩個C和C++(或所以從this question似乎)。
ORIGINAL:
我不知道我理解你的問題,但如果你正在尋找測試,如果原始套接字連接正常,窺視nopoll_conn_is_ok
function。
如果你正在尋找處理on_close
事件,比我無法幫助 - 我找不到任何on_close
事件處理程序在noPoll manual ......但我相信它應該在那裏。否則,也許可以查看facil.io而不是我爲Linux/BSD環境編寫的代碼。
我在[noPoll手冊](http://www.aspl.es/nopoll/html/group__nopoll__ctx.html)中沒有找到任何'on_close'事件處理程序......但我確定它應該是那裏有地方。否則,可以查看[facil.io](http://facil.io),而不是我爲Linux/BSD環境編寫的文章。 – Myst
P.S. 'noPoll'是一個C庫,爲什麼是C++標籤? – Myst
不得不看看,謝謝。 –