Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sockets OpenSSL非阻塞套接字接受和连接失败_Sockets_Networking_Openssl_Connect_Nonblocking - Fatal编程技术网

Sockets OpenSSL非阻塞套接字接受和连接失败

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

我的问题是: 在调用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_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连接的所有操作。除此之外,不看代码就很难知道问题在哪里。