nopoll失去了连接发现

时间:2017-10-07 00:10:26

标签: c++ c websocket

长话短说。我用noPoll制作了一个Websocket服务器。

似乎无法检测丢失的连接。应该说nopoll_conn连接活着的所有函数都说连接是好的。

但是,如果要使用该连接,则发生seg fault SIGPIPE

这不应该是发现客户端被绞死的正确方法,对吗?

我丢了什么东西吗?等待提升1.66我坚持了。

问候

AP

编辑:

nopoll_conn_is_ok(conn)表示连接良好且有效且喷射写入套接字会产生seg错误SIGPIPE。出于某种原因。

1 个答案:

答案 0 :(得分:0)

修改

实际上,接收SIGPIPE几乎是正常的"用于网络连接应用程序。

这与网络操作的复杂性及其并发性有关。

例如,假设对方发送了所有数据并关闭了连接。在您的机器上,套接字仍然应该读取来自burred的所有数据(尽管尝试发送数据会引发错误)......

...此外,noPoll使用的事件循环可能会收到HUP轮询信息(远程断开连接/挂断)并将其放入队列中。同时,您的代码可能仍在运行,或者可能在事件队列中更早放置。因此,在您的代码运行时,连接数据尚未更新。

要处理网络应用程序中的SIGPIPE(如this question所示),您应该忽略信号或处理信号(如果需要采取任何措施)。

通常人们会写:

 signal(SIGPIPE, SIG_IGN);

另一种方法可能使用更新的sigaction系统调用:

/ *设置信号处理* /   struct sigaction act,old,old_term,old_pipe;   sigemptyset(安培; act.sa_mask);   act.sa_handler = SIG_IGN;   if(sigaction(SIGPIPE,& act,& old_pipe)){     perror("无法设置信号处理程序");     出口(错误);   };

请记住加入signal.h

#include <errno.h>
#include <signal.h>

在C ++中,实现可能略有不同,但这应该适用于C和C ++(或者似乎来自this question)。

原文:

我不确定我理解您的问题,但如果您正在测试原始套接字连接是否正常,请查看nopoll_conn_is_ok function

如果你正在寻找处理on_close事件,而不是我可以帮助解决这个问题 - 我无法在{{3}中找到任何on_close事件处理程序但是我确定它应该在某个地方。否则,可能会查看noPoll manual,而不是我为Linux / BSD环境编写的。