큰 서버 응용 프로그램에서 가장 간단한 방법처럼 보이기 때문에 블로킹 모드에서 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을 통해 갈아 탄 아이디어를 삭제해야합니까?
불행히도 소켓을 닫아도 아무 효과가 없으며 BIO_reset도 수행되지 않습니다. BIO_free는 SIGSEGF를 발생시킵니다 (프로그램을 종료합니다). BIO_accept가 차단을 해제하고 종료 플래그를 볼 수 있도록 닫기 호출 스레드에서 연결을 시작했습니다. –