發表文章

目前顯示的是 10月, 2012的文章

Openssl 範例程式:建立SSL連線

說來很神奇,雖然我研究所的研究主題是「網路安全」,但我在研究所卻從來沒撰寫使用 openssl 函式庫的程式。第一次撰寫是在工作上有需求而去使用一些加密的演算法,這次則是工作尚有需求,要去建立 DTLS 的安全連線。DTLS?等一下,標題不是 SSL 嗎?說來話長,要使用 DTLS 的相關 API,按照 openssl 網站的說法,最好是使用 openssl 1.0 以後的版本,問題是客戶所使用的版本是 0.9.8d 的。理論上來說,0.9.8d 的版本也有支援 DTLS,所以我不能拒絕客戶的要求(我會努力繼續嘗試說服客戶的),但還是要做好在 0.9.8d 的開發。問題是兩個版本的寫法不一樣啊(在 1.0.0 以後的版本,有一個 dtlsv1_listen 的函式,簡單來說就是在 UDP 上面實作 listen 的行為。)~雖然已經請同事搞定 1.0 上面的寫法,但 0.9.8 上的寫法還要再研究。所以我就進去開始研究囉。下面就是研究到一半(SSL)的心得。下面的程式碼是從 HP 的網站上改過來的。 ssl_server.c # include < stdio.h > # include < stdlib.h > # include < string.h > # include < errno.h > # include < netdb.h > # include < unistd.h > # include < sys/types.h > # include < sys/socket.h > # include < netinet/in.h > # include < arpa/inet.h > # include < openssl/crypto.h > # include < openssl/ssl.h > # include < openssl/err.h > # define RSA_SERVER_CERT " serverca.crt " # define RSA_SERVER_KEY " serve

EPOLLET vs. EPOLLLT

人果然是很懶的,一轉眼,就有好長一段時間沒有發文了。這倒不是說沒有值得紀錄的事情,而是「懶」。其實本來這裡也是給自己看的而已,但還是希望能養成良好的紀錄習慣囉。 上一篇文章是關於 epoll 的範例。 epoll 在運作上有兩種模式, EPOLLET (Edge-Triggered)和 EPOLLLT (Level-Triggered)。其實我完全不知道這個名字是怎麼來的。但姑且不管名字的由來,在使用上還是要知道這兩者的差異。 先從簡單的說起,EPOLLLT 在運作上可以視做是一個比較快的POLL(這可是官方文件說的)。只要 FD 裏面還有資料可以讀取,早晚都會被 polling 到。 上面好像是廢話,那 EPOLLET 有什麼不一樣呢?當有 FD 有資料可以被存取的時候,EPOLLET 運作模式會發一個 event 出來,提醒使用者去存取資料。注意, 只會發一次唷 。意思是,如果你的資料沒有存取完畢,它也不會再發一次事件來通知。我們就參考下面來自 man 的情境會更容易了解: 1. The file descriptor that represents the read side of a pipe (rfd) is registered on the epoll instance. 2. A pipe writer writes 2 kB of data on the write side of the pipe. 3. A call to epoll_wait(2) is done that will return rfd as a ready file descriptor. 4. The pipe reader reads 1 kB of data from rfd. 5. A call to epoll_wait(2) is done. 重點在步驟 4,就算你已經讀了 1kB,意味著還有 1kB 的資料需要讀取,epoll_wait 並不會再次送出通知而會停在那邊等待。這是因為 EPOLLET 發出事件通知的條件是 FD 的狀態發生改變 。如果沒有改變,就算仍有資料要讀取,也不會有任何通知送出來。 那要如何避免這個狀況?第一,使用 EPOLLLT,這是預設的作法,但老實說,因為底層還是使用 polling ,所以效能比不上