OpenSSL DTLSv1_listen: сервер не может получить сообщение от клиента - PullRequest
0 голосов
/ 25 апреля 2011

У меня огромная проблема!И мне нужна твоя помощь!Пожалуйста, помогите мне!

Я нашел пример реализации 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();

Я создал клиента, и он отправил сообщение на сервер.Используя 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

Спасибо тебе, друг, за то, что ты пытаешься помочь мне!

1 Ответ

0 голосов
/ 29 мая 2011

Трудно сказать точно, в чем ваша проблема, но пара идей, которые могут помочь вам в поиске.

Установите обратные вызовы сообщений и информации, 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 .

...