2011-04-25 148 views
0

我有一个很大的问题!我需要你的帮助!请帮帮我!OpenSSL DTLSv1_listen:服务器无法从客户端获得消息

我找到了一个在因特网上实现DTLS的例子,它被称为dtls_udp_echo.c。 我在功能下面的代码,它描述服务器的行为:

memset(&client_addr, 0, sizeof(struct sockaddr_storage)); 


    /* Create BIO */ 

    bio = BIO_new_dgram(fd, BIO_NOCLOSE); 


    /* Set and activate timeouts */ 

    timeout.tv_sec = 5; 

    timeout.tv_usec = 0; 

    BIO_ctrl(bio, BIO_CTRL_DGRAM_SET_RECV_TIMEOUT, 0, &timeout); 


    ssl = SSL_new(ctx); 

    cout << "ssl is" << ssl ; 

    printf("ssl is \n"); 

    SSL_set_bio(ssl, bio, bio); 

    SSL_set_options(ssl, SSL_OP_COOKIE_EXCHANGE); 


    while (DTLSv1_listen(ssl, &client_addr) <= 0){ 

     //printf("%d\n",DTLSv1_listen(ssl, &client_addr)); 

    } 

    info = (struct pass_info*) malloc (sizeof(struct pass_info)); 

    memcpy(&info->server_addr, &server_addr, sizeof(struct sockaddr_storage)); 

    memcpy(&info->client_addr, &client_addr, sizeof(struct sockaddr_storage)); 

    info->ssl = ssl; 

    if (pthread_create(&tid, NULL, connection_handle, info) != 0) { 

     perror("pthread_create"); 

     exit(-1); 

    } 

} 

THREAD_cleanup(); 

我创建客户端和it've发信息给服务器。通过tcpdump,我可以看到,包

60. 250026 IP (tos 0x0, ttl 64, id 59389, offset 0, flags [DF], proto UDP (17), length 104) 127.0.0.1.8001 > 127.0.0.1.8000: UDP, length 76 

其中:

127.0.0.1 port 8001 - client 
127.0.0.1 port 8000 - server 

不过服务器似乎是盲目的,它不发送握手回客户端。 我相信地址是正确的,因为当在实验过程中我改变了他们的客户没能发送握手服务器,并有一个错误:

SSL_connect: Connection refused 
error:00000000:lib(0):func(0):reason(0) 

我OpenSSL的版本为1.0.0d

谢谢,朋友为你尝试帮助我!

回答

0

很难说你的问题到底是什么,但有几个想法可以帮助你搜索。

设置邮件和信息的回调,info_cb和msg_cb参数指定你必须提供的功能:

SSL_set_info_callback(ssl, info_cb); 
SSL_set_msg_callback(ssl, msg_cb); 

不DTLSv1_listen不会回来?在那种情况下,它会返回什么?

您也可以拨打

SSL_state_string_long(ssl) 

返回SSL的当前状态的描述。

如果您在Windows上,那么您引用的示例不起作用,因为Windows不会处理与示例所期望的相同地址和端口绑定的多个UDP套接字。要解决该问题,请参阅http://www.net-snmp.org/wiki/index.php/DTLS_Implementation_Notes