长话短说。我用noPoll制作了一个Websocket服务器。
似乎没有办法检测丢失的连接。所有应该表示nopoll_conn
连接有效的函数都表示连接良好。
但是,如果要使用该连接,则会发生seg故障SIGPIPE
。
这不应该是发现客户挂断电话的正确方式,对吧?
我丢了什么吗?在等待增压1.66时,我被它卡住了。
关于
ap
编辑:
nopoll_conn_is_ok(conn)
表示连接良好且有效,并且对套接字的喷射写入会产生seg故障SIGPIPE
。出于某种原因。
编辑:
实际上,对于网络连接应用程序来说,接收SIGPIPE
几乎是"正常"的。
这与网络操作的复杂性及其并发性有关。
例如,假设对方发送了所有数据并关闭了连接。在您的机器上,套接字仍然应该读取burred中的所有数据(尽管尝试发送数据会引发错误)。。。
此外,noPoll使用的事件循环可能会接收HUP
轮询信息(远程断开连接/挂断)并将其放入队列中。同时,您的代码可能仍在运行,或者它可能被提前放置在事件队列中。因此,在您的代码运行时,连接数据还没有更新。
要在网络应用程序中处理SIGPIPE
(如本问题所示),您应该忽略该信号或进行处理(如果需要执行任何操作)。
通常情况下,人们会写:
signal(SIGPIPE, SIG_IGN);
另一种方法可能使用更新的sigaction
系统调用:
/*设置信号处理*/结构体sigaction act,old,old_term,old_pipe;sigemptyset(&act.sa\umask);act.sa_handler=SIG_IGN;if(sigaction(SIGPIPE、&act和&old_pipe)){perror("无法设置信号处理程序");exit(errno);};
记住包括signal.h
#include <errno.h>
#include <signal.h>
在C++中,实现可能略有不同,但这应该适用于C和C++(或者从这个问题来看是这样)。
原件:
我不确定我是否理解你的问题,但如果你想测试原始套接字连接是否正常,请查看nopoll_conn_is_ok
函数。
如果你想处理on_close
事件,我无能为力——我在noPoll手册中找不到任何on_close
事件处理程序。。。但我确信它应该在某个地方。否则,也许可以看看我为Linux/BSD环境编写的facili.io。