我正在为 Linux 上的 TCP 连接编写 C++ SSL 服务器。当程序用于SSL_write()
写入封闭管道时,会抛出 SIGPIPE-Exception 导致程序关闭。我知道这是正常行为。但是当对等方没有正确关闭连接时,程序不应该总是死掉。
我已经用谷歌搜索了很多东西,并且尝试了几乎所有我发现的东西,但似乎没有什么对我有用。signal(SIGPIPE,SIG_IGN)
不起作用 - 仍然会抛出异常(对于signal(SIGPIPE, SomeKindOfHandler)
.
gdb 输出:
Program received signal SIGPIPE, Broken pipe.
0x00007ffff6b23ccd in write () from /lib/x86_64-linux-gnu/libpthread.so.0
(gdb) where
#0 0x00007ffff6b23ccd in write () from /lib/x86_64-linux-gnu/libpthread.so.0
#1 0x00007ffff7883835 in ?? () from /lib/x86_64-linux-gnu/libcrypto.so.1.0.0
#2 0x00007ffff7881687 in BIO_write () from /lib/x86_64-linux-gnu/libcrypto.so.1.0.0
#3 0x00007ffff7b9d3e0 in ?? () from /lib/x86_64-linux-gnu/libssl.so.1.0.0
#4 0x00007ffff7b9db04 in ?? () from /lib/x86_64-linux-gnu/libssl.so.1.0.0
#5 0x000000000042266a in NetInterface::SendToSubscribers(bool) () at ../Bether/NetInterface.h:181
#6 0x0000000000425834 in main () at ../Bether/main.cpp:111
关于代码:
我正在使用一个正在等待新连接并接受它们的线程。然后线程将连接信息(BIO 和 SSL)放入NetInterface
类内的静态映射中。每 5 秒NetInterface::sendTOSubscribers()
从 执行一次main()
。此函数访问静态映射并将数据发送到其中的每个连接。这个函数也是 SIGPIPE 的来源。我已经使用signal(SIGPIPE,SIG_IGN)
in main()
(显然是在 5 秒循环之前)和 in NetInterface::SendToSubscribers()
,但它在任何地方都不起作用。
谢谢你的帮助!