2011-12-14 1 views
0

AcceptEx와 OpenSSL을 사용하는 클라이언트에서 새로운 연결을 처리하는 올바른 방법을 알고 싶습니다. 정상적인 HTTP를 통해 입출력 완료 포트로 AcceptEx를 사용하는 작업용 서버가 완벽하게 작동합니다. OpenSSL 지원을 추가하고 싶습니다.AcceptEx and OpenSSL

나는 비 블로킹 소켓은 OpenSSL 사용에 대한 인터넷에 몇 가지 기사를 읽고 : 그들 중

없음에 보이지 않는다 이 작업을 수행하는 방법을 터치하면 y는 대부분 클라이언트 측 연결에 관련됩니다. AcceptEx는 소켓 연결을 설정하고 클라이언트에서 전송 된 첫 번째 데이터를 반환합니다. 내가 게시 한 첫 번째 링크는 IOCP로 들어오는 데이터를 처리하는 방법에 대해 설명합니다. 지금까지 행운없이 게시 된 것을 시도했습니다. 기본적으로 내 서버에서보고있는 내용은 다음과 같습니다.

  1. 허용되는 연결 완료를 받았습니다.
  2. SSL_new (ctx)로 SSL 객체 생성
  3. BIO_new (BIO_s_mem())를 사용하여 BIO 객체를 생성합니다.
  4. SSL 객체에서 SSL_set_bio (ssl, bioIn, bioOut)를 호출하여 BIO를 설정합니다.
  5. SSL_read 및 SSL_write가 협상을 수행 할 수 있도록 SSL_set_accept_state (ssl)을 호출합니다.

그런 다음 AcceptEx 호출에서 읽은 첫 번째 데이터 버퍼를 처리하려고합니다.

  1. BIO_Write (bioIn, buf, len)를 호출하여 읽은 데이터를 SSL에 복사합니다.
  2. 그런 다음 bioOut에서 보류중인 핸드 셰이크 데이터가 있는지 확인하여 클라이언트로 다시 보내야하는지 확인합니다. 새로운 연결을 수락하면 나는이 시점에서 바이오 아웃에 어떤 데이터도 존재한다는 것을 본 적이 없다.
  3. 그런 다음 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이 원하는 것을 모른다.

지금 당장 붙어 있지만 더 많은 것을 시도 할 것입니다. 나는 무엇이든을 계산하면이 질문을 코멘트로 업데이트 할 것이다.

답변

1

소켓에서 새 중복 된 읽기를 실행하고 완료 될 때까지 기다렸다가 BIO로 데이터를 밀어 넣고 현재 다시 수행중인 단계를 반복합니다.

ERROR_SSL_WANT_READ은 BIO가 더 많은 데이터를 필요로한다는 것을 의미합니다. 즉, 다른 읽기를 원합니다.

데이터 흐름 중에 언제든지 더 많은 응용 프로그램 수준 데이터를 BIO로 보내기 전에 SSL 계층에서 더 많은 데이터를 보내거나받을 수 있어야합니다.

나는 당신이 언급 한 기사에서이 모든 것을 아주 분명하게 다룰 수 있다고 생각했다; 이 기사의 코드는 내가 사용하는 IOCP 기반 서버에서 사용하는 코드의 기초가되었습니다 ...

+0

나는 이제 모든 것이 작동합니다. 나는 코드에 무엇이 잘못되었는지를 정확히 알 수 없었기 때문에, 그 코드의 openssl 부분을 폐기하고 샘플 코드의 구조를 좀 더 자세히 살펴봄으로써 또 하나의 괴롭힘을 당했다. 이 기사와 샘플 코드를 게시 해 주셔서 감사합니다. 꽤 도움이되었습니다. – Derek

+0

G; 유용한 광고 –