ssl - How to set SSL_connect on non blocking socket with select on linux platform -


i trying use select function have non-blocking connection client server.i found tutorial code , tried adapt this:

... 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; } ... 

the ssl_connect_nonb function defined bellow:

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; } 

the sockfd correct connect,the problem in ssl_connect_nonb select function return avalue=1 (actually condition fd_isset(sockfd, &wset) successful time),but if use blocking method :

....     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; } ... 

the value of err 0 because ssl_connect not successful, so, how ssl_connect on non blocking socket calling select function?

ssl_connect(), aka ssl client handshake, complicated process, requires several roundtrip servers. so, when run ssl_connect() on non-blocking socket, it's not enough run once. when ssl_error_want_read or ssl_error_want_write, must retry ssl_connect() again, until succeeded or failed other errors.


Comments

Popular posts from this blog

matlab - Deleting rows with specific rules -

php - MySQLi multi_query results for later use -