謝謝大牛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 老張把水壺放到火上,去客廳看電視,時不時去廚房看看水開沒有。同步非阻...