OpenSSL SSL_shutdown收到信号SIGPIPE,管道破裂
OpenSSL SSL_shutdown received signal SIGPIPE, Broken pipe
我正在使用openssl-0.9.8e编写http/https客户端
调用SSL_read()
然后,我调用SSL_get_error
得到SSL_ERROR_SYSCALL
和errno ECONNRESET 104 /* Connection reset by peer */
根据SSL文档这就是它的意思:
SSL_ERROR_SYSCALL
Some I/O error occurred. The OpenSSL error queue may contain more information on the error.
If the error queue is empty (i.e. ERR_get_error() returns 0), ret can be used to find out more about the
error: If ret == 0, an EOF was observed that violates the protocol. If ret == -1, the underlying BIO
reported an I/O error (for socket I/O on Unix systems, consult errno for details).
好,连接重置,我调用SSL_shutdown
关闭连接,哦,Program received signal SIGPIPE, Broken pipe.
天哪,我调用signal(SIGPIPE, SIG_IGN);
来忽略"SIGPIPE"信号,但它似乎不起作用~
出现分段故障
#0 0x00000032bd00d96b in write () from /lib64/libpthread.so.0
#1 0x0000003add478367 in ?? () from /lib64/libcrypto.so.6
#2 0x0000003add4766fe in BIO_write () from /lib64/libcrypto.so.6
#3 0x0000003add8208fd in ssl3_write_pending () from /lib64/libssl.so.6
#4 0x0000003add820d9a in ssl3_dispatch_alert () from /lib64/libssl.so.6
#5 0x0000003add81e982 in ssl3_shutdown () from /lib64/libssl.so.6
#6 0x00000000004565d0 in CWsPollUrl::SSLClear (this=<value optimized out>, ctx=0x2aaab804a1b0, ssl=0x2aaab804a680)
at ../src/Wspoll.cpp:1122
#7 0x00000000004575e0 in CWsPollUrl::asyncEventDelete (this=0x4d422e50, eev=0x2aaab8001160) at ../src/Wspoll.cpp:1546
#8 0x000000000045928a in CWsPollUrl::onFail (this=0x4d422e50, eev=0x2aaab8001160, errorCode=4) at ../src/Wspoll.cpp:1523
#9 0x000000000045ab17 in CWsPollUrl::handleData (this=0x4d422e50, eev=0x2aaab8001160, len=<value optimized out>) at ../src/Wspoll.cpp:1259
#10 0x000000000045abcc in CWsPollUrl::asyncRecvEvent (this=0x4d422e50, fd=<value optimized out>, eev=0x2aaab8001160)
at ../src/Wspoll.cpp:1211
#11 0x00000000004636b5 in event_base_loop (base=0x14768360, flags=0) at event.c:1350
#12 0x0000000000456a62 in CWsPollUrl::run (this=<value optimized out>, param=<value optimized out>) at ../src/Wspoll.cpp:461
#13 0x0000000000436c5c in doPollUrl (data=<value optimized out>, user_data=<value optimized out>) at ../src/PollStrategy.cpp:151
#14 0x00000032bf44a95d in ?? () from /lib64/libglib-2.0.so.0
#15 0x00000032bf448e04 in ?? () from /lib64/libglib-2.0.so.0
#16 0x00000032bd00677d in start_thread () from /lib64/libpthread.so.0
#17 0x00000032bc4d3c1d in clone () from /lib64/libc.so.6
为什么我得到SIGPIPE信号,我已经调用了signal(SIGPIPE, SIG_IGN);
有人知道为什么吗?Thanks in advance
如果您使用SSL_read获得I/O错误,那么调用SSL_shutdown没有多大意义,因为关闭尝试向对等端发送"close notify"关闭警报,这显然不会在断开的连接上工作。因此你得到SIGPIPE或EPIPE。在这种情况下,从SSL_read获取ECONNRESET可能意味着客户端已经硬关闭了连接,例如,没有执行SSL_shutdown。在出现错误后,您不应该继续使用套接字,例如,甚至不执行SSL_shutdown。
除了@SteffenUllrich答案之外,您还可以在调用SSL_shutdown
之前调用SSL_get_shutdown
并检查SSL_SENT_SHUTDOWN
标志是否已经设置。你可以这样做:
//Perform a mutex lock here
if(SSL_get_shutdown(ssl) & SSL_SENT_SHUTDOWN)
{
printf("shutdown request ignoredn");
}
else
{
SSL_shutdown(con->tls.openssl);
}
//Perform a mutex unlock here
在多个线程共享SSL *
指针的多线程程序中,可能会发生SSL_shutdown
已经被另一个线程调用的情况,这段代码可以保护您免受SIGPIPE
信号的影响。
- 在进程中对同一管道进行读取和写入时C++管道出现问题
- IPC使用多个管道和分支进程来运行Python程序
- 如何创建函数管道,以便函数一个接一个地运行?
- Gstreamer 管道从命令 lne 到 c 代码
- 外壳包装器句柄/执行交互式命令管道C++ UNIX
- 将旧管道转换为现代 openGL 时出现问题
- 如何使用管道在父级和子级之间来回传递文件
- 在没有管理员权限的情况下连接到同一网络中的命名管道
- 如何测量管道延迟?
- 我如何使用此程序管道多个命令?C++
- 先进先出:一个进程永远不会从管道读取
- Node.js fs.open() 在尝试打开 4 个以上的命名管道 (FIFO) 后挂起
- 使用模板而不是虚拟方法的管道模式
- 我可以写入关闭的套接字并强制纠正损坏的管道错误吗?
- 在 Azure DevOps 构建管道中使用英特尔C++编译器为 Linux 环境构建C++代码
- Opencv GStreamer管道在Raspberry Pi 4上不起作用
- 接收到的信号:SIGPIPE(管道破裂)
- C++和OpenSSL:SIGPIPE在封闭管道中写入时
- SIGPIPE,破裂的管道
- OpenSSL SSL_shutdown收到信号SIGPIPE,管道破裂