握手期间TLS套接字挂起

时间:2017-07-31 11:51:57

标签: c++ sockets tcp openssl nonblocking

我们有一个服务器应用程序(用C ++开发),其中多个客户端通过TCP协议使用TLS(使用OpenSSL)连接和与消息通信。在一些客户端的第一次连接尝试期间,我们观察到一种奇怪的行为,使得应用程序的接收器线程在TLS初始握手期间挂起(注意,TCP层中没有问题,即套接字接受方法)。代码片段可以看作:

int dd = accept(socket, (sockaddr*)&ss, (socklen_t*)&len); // no problem in TCP socket accept
/* some additional code here */
cout << "Trace line 1" << endl;
BIO_set_nbio (pBio, 1);  // set BIO as non-blocking
int flags = fcntl(socket, F_GETFL, 0); // set TCP socket non-blocking
fcntl(socket, F_SETFL, flags | O_NONBLOCK);

int res = SSL_accept(TheSsl);  // calling TLS accept 

flags = fcntl(socket, F_GETFL, 0); // set TCP socket blocking again
fcntl(socket, F_SETFL, flags & ~O_NONBLOCK);
BIO_set_nbio(pBio, 0); // set BIO blocking again    
cout << "Trace line 2" << endl;

我们假设我们一直在使用非阻塞I / O进行TLS握手操作,上述用法是否正确用于处理此类问题? “跟踪线1”和“跟踪线2”之间的时间间隔随机变化,即有时约16分钟,有时远超过16分钟。在这种情况下,我们观察到res值为-1,OpenSSL提供的错误值为SSL_ERROR_SYSCALL。哪个代码部分可以花费这么大的时间进行此操作?这取决于特定州或该客户的任何其他细节吗?任何评论都将不胜感激。

提前致谢。

0 个答案:

没有答案