2017-10-07 60 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环境编写的代码。