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
Post a Comment