AcceptEx와 OpenSSL을 사용하는 클라이언트에서 새로운 연결을 처리하는 올바른 방법을 알고 싶습니다. 정상적인 HTTP를 통해 입출력 완료 포트로 AcceptEx를 사용하는 작업용 서버가 완벽하게 작동합니다. OpenSSL 지원을 추가하고 싶습니다.AcceptEx and OpenSSL
나는 비 블로킹 소켓은 OpenSSL 사용에 대한 인터넷에 몇 가지 기사를 읽고 : 그들 중
- IO Completion Ports and OpenSSL
- http://zzz.zggg.com/2007/12/22/ssl-server-with-openssl-memory-bio-a-k-a-prerequisite-to-asynchronous-openssl/
- http://marc.info/?l=openssl-users&m=99909952822335&w=2
- http://www.lenholgate.com/blog/2002/11/using-openssl-with-asynchronous-sockets.html
없음에 보이지 않는다 이 작업을 수행하는 방법을 터치하면 y는 대부분 클라이언트 측 연결에 관련됩니다. AcceptEx는 소켓 연결을 설정하고 클라이언트에서 전송 된 첫 번째 데이터를 반환합니다. 내가 게시 한 첫 번째 링크는 IOCP로 들어오는 데이터를 처리하는 방법에 대해 설명합니다. 지금까지 행운없이 게시 된 것을 시도했습니다. 기본적으로 내 서버에서보고있는 내용은 다음과 같습니다.
- 허용되는 연결 완료를 받았습니다.
- SSL_new (ctx)로 SSL 객체 생성
- BIO_new (BIO_s_mem())를 사용하여 BIO 객체를 생성합니다.
- SSL 객체에서 SSL_set_bio (ssl, bioIn, bioOut)를 호출하여 BIO를 설정합니다.
- SSL_read 및 SSL_write가 협상을 수행 할 수 있도록 SSL_set_accept_state (ssl)을 호출합니다.
그런 다음 AcceptEx 호출에서 읽은 첫 번째 데이터 버퍼를 처리하려고합니다.
- BIO_Write (bioIn, buf, len)를 호출하여 읽은 데이터를 SSL에 복사합니다.
- 그런 다음 bioOut에서 보류중인 핸드 셰이크 데이터가 있는지 확인하여 클라이언트로 다시 보내야하는지 확인합니다. 새로운 연결을 수락하면 나는이 시점에서 바이오 아웃에 어떤 데이터도 존재한다는 것을 본 적이 없다.
- 그런 다음 SSL_read (ssl, plainTextBuf, len)를 호출하여 6 단계에서 bioIn에 입력 한 데이터의 암호를 해독하려고 시도합니다. 항상 -1을 반환하고 SSL_get_error는 ERROR_SSL_WANT_READ를 반환합니다. 내가 이해할 수있는 한, 이것은 bioIn이 전체 SSL 레코드를 가지고 있지 않다는 것을 의미하므로, SSL은 클라이언트로부터 아무 데이터도 해독하기 전에 더 많은 데이터를 필요로합니다.
여기에 내가 문제에 부딪히기 시작하는 곳과 그 곳에서 나는 어떤 방향이 필요하다고 생각한다. 나는 여러 가지 것을 시도했다. 이 시점에서 SSL_read를 반복적으로 호출하면 ERROR_SSL_WANT_READ가 무한대로 반환됩니다. 아마도 메모리 BIO가 소켓을 통해 더 이상 데이터를 수신하지 못하기 때문입니다. 클라이언트로부터 더 많은 데이터를 기다리기 위해 WSARecv 호출을 게시해야합니까?
이 시점에서 BIO_read를 사용하여 bioOut 버퍼를 검사하여 클라이언트로 다시 보내야하는 데이터가 있는지 확인하려고했습니다. 사실 몇 가지가 있습니다. WSASend를 사용하여이 데이터를 보내고 다른 데이터 수신을 기다리는 또 다른 WSARecv 호출을 보냅니다 (내 보내기에 대한 응답으로). 이로 인해 클라이언트에서 더 많은 데이터를 수신하게됩니다 (WSARecv는 전송이 완료된 후 완료됩니다). 따라서 연결이 진행중인 것처럼 보입니다. 그러나이 완료된 읽기 처리 할 때 SSL_read 및 BIO_read 모두 ERROR_SSL_WANT_READ를 반환합니다.따라서 전체 레코드를 해독하기에 충분한 데이터가 없으며 클라이언트에게 다시 보낼 수있는 방법이 없습니다. 이 상황에 대한 응답으로 다른 WSARecv 호출을 게시해도 클라이언트에서 더 이상 데이터를받지 못합니다. 나는 SSL이 원하는 것을 모른다.
지금 당장 붙어 있지만 더 많은 것을 시도 할 것입니다. 나는 무엇이든을 계산하면이 질문을 코멘트로 업데이트 할 것이다.
나는 이제 모든 것이 작동합니다. 나는 코드에 무엇이 잘못되었는지를 정확히 알 수 없었기 때문에, 그 코드의 openssl 부분을 폐기하고 샘플 코드의 구조를 좀 더 자세히 살펴봄으로써 또 하나의 괴롭힘을 당했다. 이 기사와 샘플 코드를 게시 해 주셔서 감사합니다. 꽤 도움이되었습니다. – Derek
G; 유용한 광고 –