2017-10-07 160 views
0

長話短說。我用noPoll創建了一個Websocket服務器。nopoll失去連接發現

似乎沒有辦法檢測到丟失的連接。所有應該說nopoll_conn連接活動的功能都表示連接良好。

但是,如果您要使用該連接,則會發生seg故障,SIGPIPE

這不應該是發現客戶被吊死的正確方法,對嗎?

我丟了東西嗎?而等待提升1.66我堅持這一點。

問候

AP

編輯:

nopoll_conn_is_ok(conn)說,連接是否良好,充滿活力和噴氣書面插座生產賽格故障,SIGPIPE。因爲某些原因。

+0

我在[noPoll手冊](http://www.aspl.es/nopoll/html/group__nopoll__ctx.html)中沒有找到任何'on_close'事件處理程序......但我確定它應該是那裏有地方。否則,可以查看[facil.io](http://facil.io),而不是我爲Linux/BSD環境編寫的文章。 – Myst

+0

P.S. 'noPoll'是一個C庫,爲什麼是C++標籤? – Myst

+0

不得不看看,謝謝。 –

回答

0

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環境編寫的代碼。