2014-01-15 4 views
2

큰 서버 응용 프로그램에서 가장 간단한 방법처럼 보이기 때문에 블로킹 모드에서 BIO를 사용하는 기본 OpenSSL 서버와 하나의 스레드가 있습니다. 내 코드는 휴대 전화 (Android 또는 iOS)에서 요청하는 단일 유형을 허용하고 그 코드를 작성하지 않습니다. 기본 HTML로 래핑 된 16 진수 문자열을 반환합니다 (내 서버 상태의 일부를 설명 함). 저는 SSL 개발자와 psuedo-HTTPS 서버를 가지고 있기 때문에 전화 개발자가 쉽게 만들 수 있습니다. 요청에 서버가 이해하지 못하는 것이 있으면 404를 반환합니다.이 모든 것이 작동합니다.BIO를 사용하여 OpenSSL 서버를 종료하려면 어떻게합니까?

문제 : : 서버가 종료되면 BIO_do_accept 호출이 차단되어이 스레드가 종료되지 않습니다.

BIO_get_fd() 및 setsockopt()를 사용해 기본 소켓에서 시간 초과를 시도했지만 여전히 차단됩니다. 다소 걱정스럽게 SSL_state()는 "before/accept initialization"에 머물러 있지만 분명히 루핑을하면 작동하지 않습니다.

나는 다른 사람들이 이와 같은 서버 코드를 가지고 있다고 가정하고 그 서버를 정상적으로 종료 할 수 있습니다. 그들은 어떻게합니까? 다른 스레드가 그 블록을 깰 수있는 몇 가지 방법이 있습니까 오류와 함께 반환하는 수락 호출? 아니면 전화를 차단하고 apparently awful non-blocking version을 통해 갈아 탄 아이디어를 삭제해야합니까?

답변

2

내 서버가 종료되면이 스레드는 차단 BIO_do_accept 호출로 인해 종료되지 않습니다.

차단을 중지하려면 관련 소켓을 닫으십시오. 즉시 반환됩니다.

신호 처리기에서 시스템 종료를 수행하십시오.

OpenSSL과 관련하여 신호 처리기에서 비동기 신호가 안전하지 않기 때문에 다른 작업을 수행하지 마십시오. 작업자 스레드가 반환되면 주 스레드를 정리하십시오. 예를 들어 libcrypto Thread Safety을 참조하십시오.

+0

불행히도 소켓을 닫아도 아무 효과가 없으며 BIO_reset도 수행되지 않습니다. BIO_free는 SIGSEGF를 발생시킵니다 (프로그램을 종료합니다). BIO_accept가 차단을 해제하고 종료 플래그를 볼 수 있도록 닫기 호출 스레드에서 연결을 시작했습니다. –

관련 문제