Sockets OpenSSL非阻塞套接字接受和连接失败
我的问题是: 在调用accept或connect之前,将套接字设置为非阻塞是否不好?或者应该使用阻塞接受和连接,然后将套接字更改为非阻塞 我是OpenSSL新手,对网络编程不是很有经验。我这里的问题是,我试图使用OpenSSL和非阻塞套接字网络来增加安全性。当我在服务器端调用SSL\u accept,在客户端调用SSL\u connect,并使用Sockets OpenSSL非阻塞套接字接受和连接失败,sockets,networking,openssl,connect,nonblocking,Sockets,Networking,Openssl,Connect,Nonblocking,我的问题是: 在调用accept或connect之前,将套接字设置为非阻塞是否不好?或者应该使用阻塞接受和连接,然后将套接字更改为非阻塞 我是OpenSSL新手,对网络编程不是很有经验。我这里的问题是,我试图使用OpenSSL和非阻塞套接字网络来增加安全性。当我在服务器端调用SSL\u accept,在客户端调用SSL\u connect,并使用 SSL_get_error(m_ssl, n); char error[65535]; ERR_error_string_n(ERR_get_erro
SSL_get_error(m_ssl, n);
char error[65535];
ERR_error_string_n(ERR_get_error(), error, 65535);
SSL\u get\u error返回的代码表示SSL\u error\u WANT\u READ,而ERR\u error\u string\n打印出error:00000000:lib0:func0:reason0,我认为这意味着没有错误。SSL\u错误\u想要\u读取意味着我需要重试SSL\u接受和SSL\u连接
然后我使用循环重试这些函数,但这只会导致无限循环:
我相信我已经正确初始化了SSL,下面是代码
//CRYPTO_malloc_init();
SSL_library_init();
const SSL_METHOD *method;
// load & register all cryptos, etc.
OpenSSL_add_all_algorithms();
// load all error messages
SSL_load_error_strings();
if (server) {
// create new server-method instance
method = SSLv23_server_method();
}
else {
// create new client-method instance
method = SSLv23_client_method();
}
// create new context from method
m_ctx = SSL_CTX_new(method);
if (m_ctx == NULL) {
throwError(-1);
}
如果有任何部分我没有提到,但你认为这可能是问题所在,请让我知道
SSL\u错误\u想要\u读取意味着我需要重试SSL\u接受和SSL\u连接
是的,但这不是全部的故事。
您应该仅在套接字可读后重试调用,例如,您需要使用select或poll或类似函数等待,直到套接字可读为止。同样的情况也适用于SSL\u ERROR\u WANT\u WRITE,但是这里您必须等待套接字变得可写
如果您不等待就重试,它可能最终会成功,但只有在有100次失败的呼叫之后。虽然执行select并不保证它会在下一次调用时立即成功,但在成功之前只需调用几个SSL\u connect/SSL\u accept调用,同时它不会忙于循环并占用CPU。OpenSSL\u添加所有算法都会定义到SSL\u library\u init。奇怪的是,我刚刚解决了一个问题,本质上我必须调用这两个函数,调用SSL\u library\u init两次。但我们只需要一个电话。谢谢你的回复。在我可以连接服务器和客户端之后,我会担心性能。不等待的循环不起作用:当我调用connect时,我是否需要在另一个线程中进行循环?@Jerry:你最好在同一个线程中完成属于同一SSL连接的所有操作。除此之外,不看代码就很难知道问题在哪里。