我有一个非阻塞套接字,我使用openssl创建一个ssl连接。我的问题是SSL_connect的工作方式。在这些情况下,它返回SSL_ERROR_WANT_READ或SSL_ERROR_WANT_WRITE,必须再次调用SSL_connect。现在这实际上是有效的。我遇到的问题是,应该使程序等待套接字准备就绪的select()不起作用。这导致超过2000次调用SSL_connect,这是不好的。
以下是本部分程序的代码
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在别处定义。我在程序的其他部分使用相同类型的选择它工作得很好。 正如我所说,该计划正在运作,但只是没有等待选择。我可以睡觉,但这不是一个好的解决方案。提前谢谢!
答案 0 :(得分:1)
好的,我是个假人。 问题在行
if (test == SSL_ERROR_WANT_READ)
这必须是
if (SSL_get_error(sslHandle, sslConnectResult) == SSL_ERROR_WANT_READ)
比代码工作得好。它迭代4到5次而不是连接。