2011-04-25 8 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

정확하게 문제를 말하기는 어렵지만 검색에 도움이되는 몇 가지 아이디어가 있습니다.

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

합니까 DTLSv1_listen 이제까지 반환 :

설정 메시지와 정보를 콜백, info_cb 및 msg_cb 사용자가 제공해야 할 기능인가? 그 경우에, 그것은 무엇을 반환합니까?

또한 SSL의 현재 상태에 대한 설명을 반환

SSL_state_string_long(ssl) 

를 호출 할 수 있습니다.

예를 들어 Windows에서 동일한 주소와 포트에 바인딩 된 여러 UDP 소켓을 처리하지 않으므로 참조하는 예제가 작동하지 않습니다. 이 문제를 해결하려면 http://www.net-snmp.org/wiki/index.php/DTLS_Implementation_Notes을 참조하십시오.

관련 문제