2014-03-23 5 views
2

Я пишу клиент HTTP/HTTPS с использованием OpenSSL-0.9.8eOpenSSL SSL_shutdown получил сигнал SIGPIPE, Разбитое трубку

Я получаю ошибку, когда я называю SSL_read()

тогда, я называю SSL_get_error получить SSL_ERROR_SYSCALL и ERRNO ECONNRESET 104 /* Connection reset by peer */

ССЛ Согласно наблюдениям documetation это то, что это означает:

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). 

хорошо, Connecti при сбросе, звоню SSL_shutdown закрыть соединение, ой, Program received signal SIGPIPE, Broken pipe.

Бог, я призываю signal(SIGPIPE, SIG_IGN); игнорировать "SIGPIPE" сигнал, но это, кажется, does't работа ~

сегментация Fault произойдет

#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); Кто-нибудь знает почему?

Заранее спасибо

+0

Если у вас возникла ошибка при чтении, кроме таймаута, вы почти наверняка имеете дело с уже сломанным соединением. Любые последующие ошибки, которые вы можете получить, вероятно, должны быть проигнорированы. – EJP

+0

Вы действительно на самом деле называете 'signal (SIGPIPE, SIG_IGN);' в этом процессе? Если вы вызвали его перед fork и exec, он может быть сброшен. Также кажется бесполезным корректно закрыть соединение, которое было нарушено сверстником. – Marian

ответ

1

Если вы получите сообщение об ошибке ввода/вывода с SSL_read нет особого смысла называть SSL_shutdown, потому что отключение пытается отправить «закрыть уведомления» уведомление о завершении работы сверстников, и это, очевидно, будет не работает на сломанном соединении. Поэтому вы получаете SIGPIPE или EPIPE. Получение ECONNRESET из SSL_read в этом случае, вероятно, означает, что клиент закрыл соединение, например, без использования SSL_shutdown. Не следует продолжать работу с сокетом после ошибки, например. даже не делая SSL_shutdown.