I am using DTLSv1_listen in non-blocking underlying socket layer. I am using openssl-0.9.8o and I looked at the implementation.
int dtls1_listen(SSL *s, struct sockaddr *client) { int ret; SSL_set_options(s, SSL_OP_COOKIE_EXCHANGE); s->d1->listen = 1; ret = SSL_accept(s); if (ret <= 0) return ret; (void) BIO_dgram_get_peer(SSL_get_rbio(s), client); return 1; } Does this mean that we do not have to call SS_accept after DTLSv1_listen() returns with 1. And if it returns -1 with SSL_ERROR_WANT_READ or SSL_ERROR_WANT_WRITE then we call again till we get the connection established ? My understanding was that we have to do SSL_accept on a connected socket so that SSL handshake happens separately(certificate/key exchange) and listen socket only receives ClientHello, sends Helloverify Request and receives ClientHelloWithCookie. In some examples on web we see that we do call SSL_accept() after DTLSv1_listen returns with 1. But I looked at s_server.c in the openssl sources, it does not even call DTLSv1_listen(). How do I understand this ? I am confused here. If some one can guide I would appreciate. --Nilesh.