2016-02-13 112 views
0

我想为我多年前写的旧聊天应用程序添加一个ssl支持。我在OpenSSL和LibreSSL上做了大量的阅读,并决定尝试一个新的libtls API。我认为开发人员在这个方面做得非常出色。 我发现它非常易于使用 - 几乎不需要对现有代码进行更改。但现在我需要弄清楚一件事:libtls:select()和tls_read()一起工作

早在一天中,我就使用select()来监视套接字并使用recv()来读取数据。这很容易,因为这两个函数都在处理文件描述符。

现在,在libtls中,函数tls_read()需要tls上下文作为第一个参数。这意味着我需要在每次准备好读取描述符时搜索客户端列表以获取适当的tls上下文。这并不难,但也许有人知道更好的解决方案?我会欣赏所有评论和代码示例。

+0

请分享一些代码和一个明确的问题。 http://stackoverflow.com/help/how-to-ask – bibi

回答

0

除非我误读了文件,在我看来,如果你自己创建的插座,然后用tls_connect_fds/tls_connect_socket/tls_accept_fds/tls_accept_socket之后,你就会有正常可用的文件句柄,你可以平凡与select()使用/ poll() /等。一旦你准备好了,你仍然需要保留某种文件描述符到上下文的映射来实际发布tls_read/tls_write,但这只是你选择的链表或散列表,这取决于你使用的是什么语言和stdlib你有空。

+0

你能否引用说明文档?我很怀疑,因为我所使用的每个SSL/TLS实现都有一种方法来检查是否存在被TLS层缓冲的解码字节,不再由poll()或select()报告。可以使用SSL_pending(OpenSSL),gnutls_record_check_pending(GNU TLS),SSLGetBufferedReadSize(OSX Secure Transport)来检查这些问题。 mbedTLS不提供一种友好的方式来检查;一个解决方法是尝试读取一个字节,然后将其存储直到下一次读取。 –