非阻塞 非同步 epoll openssl

2021-07-22 03:46:57 字數 1433 閱讀 8623

謝謝大牛dongfuye

前段時間在自己的非同步網路框架handy中新增openssl的支援,當時在網路上搜尋了半天也沒有找到很好的例子,後來自己慢慢的摸索,耗費不少時間,終於搞定。因此把相關的資料整理一下,並給出簡單的例子,讓後學者可以少費些力氣。

同步的openssl呼叫網上已經有許多的例子,這裡就不再詳細介紹,大家也可以直接讀源**:

同步客戶端:

該例子連線www.openssl.com:443,傳送乙個http請求,並列印結果中的前256個字元

同步伺服器端:

該例子監聽本地的443埠,並返回乙個簡單http響應

下面詳細介紹非阻塞呼叫

1. 初始化ssl庫

ssl_load_error_strings ();

ssl_library_init ();

sslcontext = ssl_ctx_new (sslv23_method ());

//server端需要初始化證書與私鑰

string cert = "server.pem", key = "server.pem";

r = ssl_ctx_use_certificate_file(g_sslctx, cert.c_str(), ssl_filetype_pem);

r = ssl_ctx_use_privatekey_file(g_sslctx, key.c_str(), ssl_filetype_pem);

r = ssl_ctx_check_private_key(g_sslctx);

2. 非阻塞方式建立tcp連線(網上有很多epoll相關例子)

3. 使用已建立連線的socket初始化ssl

ch->ssl_ = ssl_new (g_sslctx);

int r = ssl_set_fd(ch->ssl_, ch->fd_);

伺服器端 ssl_set_accept_state(ch->ssl_);

客戶端 ssl_set_connect_state(ch->ssl_);

4. epoll_wait後,如果ssl相關的socket有讀寫事件需要處理則進行ssl握手,直到握手完成

int r = ssl_do_handshake(ch->ssl_);

if (r == 1)

int err = ssl_get_error(ch->ssl_, r);

if (err == ssl_error_want_write) else if (err == ssl_error_want_read) else

5. 握手完成後,進行ssl資料的讀寫

ssl_write(con->sslhandle, text, len);

ssl_read(con->sslhandle, buf, sizeof buf);

詳細可執行的例子參看

handy已經對openssl進行了封裝,並且給出了例子,詳見

非同步非阻塞

sk.setblocking false 不會阻塞但是會報錯 setattr sk,callback func url func 1 try 阻塞,非阻塞報錯,捕捉錯誤 sk.connect url func 0 80 except blockingioerror as e pass while t...

非同步非阻塞

首先討論下使用事件驅動,非同步程式設計的優點 充分利用了系統資源,執行 無須阻塞等待某種操作完成,有限的資源可以用於其他的任務。其非常適合於後端的網路服務程式設計。在伺服器開發中,併發的請求處理是個大問題,阻塞式的函式會導致資源浪費和時間延遲。通過事件註冊 非同步函式,開發人員可以提高資源的利用率,...

阻塞,非阻塞,非同步,同步

之前一直對這個概念理不太清楚,今天看到一篇文章感覺不錯 本文 老張愛喝茶,廢話不說,煮開水。出場人物 老張,水壺兩把 普通 水壺,簡稱水壺 會響的水壺,簡稱響水壺 1 老張把水壺放到火上,立等水開。同步阻塞 老張覺得自己有點傻 2 老張把水壺放到火上,去客廳看電視,時不時去廚房看看水開沒有。同步非阻...