비 차단 소켓이 있고 SSL 연결을 만들기 위해 openssl을 사용하고 있습니다. 내 문제는 SSL_connect가 작동하는 방식입니다. SSL_ERROR_WANT_READ 또는 SSL_ERROR_WANT_WRITE를 반환합니다. 이러한 경우 SSL_connect를 다시 호출해야합니다. 이제 이것은 실제로 작동합니다. 내가 가진 문제는 프로그램이 소켓이 준비 될 때까지 기다려야하는 select ()가 작동하지 않는다는 것입니다. 이로 인해 SSL_connect에 대한 2000 개 이상의 호출이 발생하지만 좋지 않습니다.
다음은 프로그램의이 부분에 대한 내 코드입니다.
int test = 0;
while (test != 1) {
test = SSL_connect(sslHandle);
if (test != 1) { //test again or we would quit if we made a connection
if (SSL_get_error(sslHandle, test) != SSL_ERROR_WANT_READ && SSL_get_error(sslHandle, test) != SSL_ERROR_WANT_WRITE) {
//error happend
return -1;
}
FD_ZERO(&socketSet); //reset socketSet
FD_SET(socket, &socketSet); //init socketSet with our socket
if (test == SSL_ERROR_WANT_READ) {
result = select(socket + 1, &socketSet, NULL, NULL, &timeoutCopy); //wait for the socket to be readable
if (result == 0) {
//timeout
return -1;
} else if (result == -1) {
//error
return -1;
}
} else {
result = select(socket + 1, NULL, &socketSet, NULL, &timeoutCopy); //wait for the socket to be writable
if (result == 0) {
//timeout
return -1;
} else if (result == -1) {
//error
return -1;
}
}
}
}
나는 모든 오류 처리 항목과 로그를 제거하여 더 잘 읽을 수 있도록했습니다. timeoutCopy는 다른 곳에서 정의됩니다. 프로그램의 다른 부분에 대해 동일한 종류의 선택을 사용하고 있습니다. 내가 말했듯이 프로그램은 작동하지만 선택을 기다리지 않습니다. 잠을 잘 수 있지만 좋은 해결책은 아닙니다. 미리 감사드립니다!
좋아, 나는 더미입니다. 문제가 발생했습니다.
if (test == SSL_ERROR_WANT_READ)
이것은
if (SSL_get_error(sslHandle, sslConnectResult) == SSL_ERROR_WANT_READ)
코드가 잘 작동하는 것보다. 4 ~ 5 회 반복되며 연결이있는 것보다 더 많습니다.
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다