int kn_sock_sslconnect(//engine_t e, handle_t h, kn_sockaddr *remote, kn_sockaddr *local){ if(h->type != KN_SOCKET && ((kn_socket*)h)->type != SOCK_STREAM) return 0; kn_socket *s = (kn_socket*)h; if(h->status != SOCKET_NONE) return -1; //if(s->e) return -1; SSL_CTX *ctx = SSL_CTX_new(SSLv23_client_method()); if (ctx == NULL) { ERR_print_errors_fp(stdout); return -1; } ((kn_stream_socket*)s)->ctx = ctx; s->addr_remote = *remote; int ret = stream_socket_connect((kn_stream_socket*)s,local,remote); if(ret == 1){ ((kn_stream_socket*)s)->ssl = SSL_new(ctx); SSL_set_fd(((kn_stream_socket*)s)->ssl,h->fd); if (SSL_connect(((kn_stream_socket*)s)->ssl) == -1){ ERR_print_errors_fp(stderr); ret = -1; } else { kn_set_noblock(h->fd,0); h->status = SOCKET_ESTABLISH; printf("Connected with %s encryption/n", SSL_get_cipher(((kn_stream_socket*)s)->ssl)); ShowCerts(((kn_stream_socket*)s)->ssl); } }else{ ret = -1; } return ret; }
int kn_sock_connect(handle_t h, kn_sockaddr *remote, kn_sockaddr *local) { if(((handle_t)h)->type != KN_SOCKET) return -1; kn_socket *s = (kn_socket*)h; if(s->comm_head.status != SOCKET_NONE) return -1; if(s->type == SOCK_STREAM){ return stream_socket_connect((kn_stream_socket*)s,local,remote); }else if(s->type == SOCK_DGRAM){ return datagram_socket_connect((kn_datagram_socket*)s,local,remote); } return -1; }