Пример #1
0
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;		
}
Пример #2
0
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);    
}