nopoll丢失连接发现



长话短说。我用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。

最新更新