如何在linux平台上使用select在非阻塞套接字上设置SSL_connect
我正在尝试使用select函数实现从客户端到服务器的无阻塞连接。我找到了一个包含一些代码的教程,并尝试对此进行调整:如何在linux平台上使用select在非阻塞套接字上设置SSL_connect,select,ssl,openssl,connect,Select,Ssl,Openssl,Connect,我正在尝试使用select函数实现从客户端到服务器的无阻塞连接。我找到了一个包含一些代码的教程,并尝试对此进行调整: ... sockfd = socket(AF_INET, SOCK_STREAM, 0); err = connect(sockfd,(struct sockaddr*)&sa,sizeof(sa)); ... SSL_set_fd(pssl,sockfd); err = SSL_connect_nonb(pssl,sockfd,60); if(err <=0 ){
...
sockfd = socket(AF_INET, SOCK_STREAM, 0);
err = connect(sockfd,(struct sockaddr*)&sa,sizeof(sa));
...
SSL_set_fd(pssl,sockfd);
err = SSL_connect_nonb(pssl,sockfd,60);
if(err <=0 ){
printf("SSL_connect:%s\n",ERR_error_string(SSL_get_error(pssl,err),NULL));
return -1;
}
...
。。。
sockfd=套接字(AF_INET,SOCK_STREAM,0);
err=connect(sockfd,(struct sockaddr*)&sa,sizeof(sa));
...
SSL\u set\u fd(pssl,sockfd);
err=SSL\u connect\u nonb(pssl,sockfd,60);
如果(errSSL\u connect()
,又称SSL客户端握手,是一个复杂的过程,需要与服务器进行多次往返。因此,当运行SSL\u connect()时
在非阻塞套接字上,仅运行一次是不够的。当您得到SSL\u ERROR\u WANT\u READ
或SSL\u ERROR\u WANT\u WRITE
时,必须再次重试SSL\u connect()
,直到成功或失败,并出现其他错误
int SSL_connect_nonb(SSL*pssl,int sockfd, int nsec)
{
int flags, error;
socklen_t len;
fd_set rset, wset;
struct timeval tval;
flags = fcntl(sockfd, F_GETFL, 0);
fcntl(sockfd, F_SETFL, flags | O_NONBLOCK);
int err = SSL_connect(pssl);
int err2 = SSL_get_error(pssl,err);
switch(err2) {
default:
printf("SSL_connect err=%s\n",ERR_error_string(err2,0));
return -1;
break;
case SSL_ERROR_WANT_READ:
case SSL_ERROR_WANT_WRITE:
break;
}
FD_ZERO(&rset);
FD_ZERO(&wset);
FD_SET(sockfd, &rset);
FD_SET(sockfd, &wset);
tval.tv_sec = nsec;
tval.tv_usec = 0;
if (select(sockfd+1, &rset, &wset, NULL,nsec ? &tval:NULL) == 0) {
return -1;
}
if(FD_ISSET(sockfd,&rset) || FD_ISSET(sockfd, &wset )) {
len = sizeof(error);
if(getsockopt(sockfd, SOL_SOCKET, SO_ERROR, &error, &len) < 0){
return -1;
}
}else{
printf("sockfd not set\n");
return -1;
}
fcntl(sockfd, F_SETFL, flags);
if (error) {
return -1;
}
return 1;
}
....
SSL_set_fd(pssl,sockfd);
err = SSL_connect(pssl);
if(err <=0 ){
printf("SSL_connect:%s\n",ERR_error_string(SSL_get_error(pssl,err),NULL));
return -1;
}
...