长话短说。我用noPoll制作了一个Websocket服务器。
似乎无法检测丢失的连接。应该说nopoll_conn
连接活着的所有函数都说连接是好的。
但是,如果要使用该连接,则发生seg fault SIGPIPE
。
这不应该是发现客户端被绞死的正确方法,对吗?
我丢了什么东西吗?等待提升1.66我坚持了。
问候
AP
编辑:
nopoll_conn_is_ok(conn)
表示连接良好且有效且喷射写入套接字会产生seg错误SIGPIPE
。出于某种原因。
答案 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环境编写的。