Я пытаюсь установить DTLS-соединение с использованием OpenSSL 1.1.1.
Я постоянно получаю SSL_ERROR_SYSCALL
при попытке запустить DTLSv1_listen()
на сокете.
Я использую один сокет AF_INET, DGRAM, UDP для получения всех входящих данных. Я предположил Я мог бы оставить все как есть, и OpenSSL позаботится об определении отправителя при получении дейтаграммы, но я начинаю думать, что ошибаюсь.
У меня есть: (обработка ошибок для краткости опущена)
SSL_CTX *ctx = SSL_CTX_new(DTLS());
SSL_CTX_use_certificate_file(ctx, "certs/server-cert.pem", SSL_FILETYPE_PEM);
SSL_CTX_use_PrivateKey_file(ctx, "certs/server-key.pem", SSL_FILETYPE_PEM);
SSL_CTX_set_cookie_generate_cb(ctx, generate_cookie);
SSL_CTX_set_cookie_verify_cb(ctx, &verify_cookie);
int fd = socket(AF_INET, SOCK_DGRAM, 0);
setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, (const void*) &on, (socklen_t) sizeof(on));
bind(fd, (const struct sockaddr *) &server_addr, sizeof(struct sockaddr_in))
SSL *ssl = SSL_new(ctx);
SSL_set_fd(ssl, fd);
SSL_set_accept_state(ssl);
while(DTLSv1_listen(ssl, (BIO_ADDR *) BIO_get_conn_address(SSL_get_rbio(ssl))) <= 0)
...
Как я уже говорил, эта последняя строка дает мне SSL_ERROR_SYSCALL.
errno
дает мне 0
.
Я подозреваю, что мне не хватает некоторых шагов в конфигурации CTX, но я не уверен, что.
Я просматривал несколько примеров, и один из них привлек мое внимание. Кажется, создается новый сокет всякий раз, когда он получает дейтаграмму и делает connect()
на этом сокете с удаленным адресом. Мне это кажется немного нелепым, поскольку я не думаю, что UDP требует сокета для каждого клиента AFAIK.