OpenSSL的SSL/BIO_get_fd
只要是用到了OpenSSL,總會碰到讓人心塞的事。
這次是SSL_get_fd。我用一種很簡單的方式創建了一個SSL對象,直接在這個對象上進行SSL的accept:
這樣就不必折騰討厭的sockaddr了。后來我想在和這個SSL對象關聯的底層socket上執行 setsockopt,想當然的使用了SSL_get_fd/BIO_get_fd這個非常自明的API。到此為止非常棒。接下來就不爽了,我發現 setsockiot最終操作的那個描述符是listnen套接字,而不是accept返回的那個套接字。這似乎在API層面上十分合理,畢竟bio的參 數就是一個BIO_s_accept,而和它關聯的就是一個listen套接字。想要正確的得到accept返回的讀寫socket描述符,你得這么寫:
問題是,你必須知道這個BIO stack是如何排列的才能寫出上面的代碼,做到如此最好的辦法就是看OpenSSL的源代碼。
?????? BIO的API設計就一定要設計成get/set_fd嗎?BIO就一定要和一個fd相關嗎?memory類型的BIO如果get fd的話,會返回怎么的錯誤嗎呢?既然BIO構成了一個疊加的IO stack,那么也許之有最下面的那個才會和一個UNIX fd相關聯,那為何不直接返回最下面那個呢?
轉載于:https://blog.51cto.com/dog250/1592061
總結
以上是生活随笔為你收集整理的OpenSSL的SSL/BIO_get_fd的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: golang 位操作
- 下一篇: 方法中的参数的五种形式