int kn_sock_listen(handle_t h, kn_sockaddr *local) { if(!(((handle_t)h)->type & KN_SOCKET)) return -1; kn_socket *s = (kn_socket*)h; if(s->type == SOCK_STREAM){ return stream_socket_listen((kn_stream_socket*)s,local); }else if(s->type == SOCK_DGRAM){ return datagram_socket_listen((kn_datagram_socket*)s,local); } return -1; }
int kn_sock_ssllisten(handle_t h, kn_sockaddr *addr, const char *certificate, const char *privatekey ){ if(h->type != KN_SOCKET && ((kn_socket*)h)->type != SOCK_STREAM) return 0; kn_stream_socket *ss = (kn_stream_socket*)h; if(h->status != SOCKET_NONE) return -1; /* 以 SSL V2 和 V3 标准兼容方式产生一个 SSL_CTX ,即 SSL Content Text */ SSL_CTX *ctx = SSL_CTX_new(SSLv23_server_method()); /* 也可以用 SSLv2_server_method() 或 SSLv3_server_method() 单独表示 V2 或 V3标准 */ if (ctx == NULL) { ERR_print_errors_fp(stdout); return -1; } /* 载入用户的数字证书, 此证书用来发送给客户端。 证书里包含有公钥 */ if (SSL_CTX_use_certificate_file(ctx,certificate, SSL_FILETYPE_PEM) <= 0) { ERR_print_errors_fp(stdout); SSL_CTX_free(ctx); return -1; } /* 载入用户私钥 */ if (SSL_CTX_use_PrivateKey_file(ctx, privatekey, SSL_FILETYPE_PEM) <= 0) { ERR_print_errors_fp(stdout); SSL_CTX_free(ctx); return -1; } /* 检查用户私钥是否正确 */ if (!SSL_CTX_check_private_key(ctx)) { ERR_print_errors_fp(stdout); SSL_CTX_free(ctx); return -1; } kn_set_noblock(((handle_t)ss)->fd,0); ss->ctx = ctx; return stream_socket_listen(ss,addr); }