- Scoket Programming : Non-Blocking Communation
現在大部分的設計師都比較少人去實做底層的功能,畢竟直接使用以成熟的API會比較方便。在Scoket Programming過程中,你可能會發現當A端send一些資料到B端時,這時如果B端沒有對應的recv去接收這些資料,A,B兩端將會無法正常工作下去,這就是所謂的阻塞式(Blocking)的傳輸,為了解決這樣的一個問題你可以加上一些timeout,讓程式不會永遠一直在等待接收或傳輸的資料,而在unix socket programming裡我們可以用select()這個函式來實現。這裡就以一個簡單的聊天程式作為範例,程式主架構沿用[C/C++] Socket Connection這一篇的基礎,因為是non-blocking 傳輸,所以我刻意讓Server跟Client都共用一個chat()函式,以方便修改,主要部份如下:
進入一個無限的while loop之後先清空FD集合,以便做之後的監聽工作
如果等待的回傳值大於一,代表I/O上有動作,接著使用兩個if來判斷訊息的來源,如下:
使用FD_ISSET來判斷資料的來源,再決定是要傳送出去還是列印在螢幕上。
如此一來,non-blocking的設計就完成了,關於細部的select()資訊可以參考下面的網頁:
http://linux.die.net/man/2/select
因為程式是在terminal底下執行,為了讓文字好區別我同時也用了設定文字顏色的功能,這部份的資訊你可以參考[C/C++] Colour Terminal,另外關於聊天程式的設計你可能不解的是為什麼有一方會是Server來等待接收,而不是雙方都是Client?是因為這是展示版,所以並沒有實做得很完全,如果真的要達到類似即時通訊的架構,有一個Server然後多個Client連上Server後去做通訊,這時整個架構就需要改寫成Server有多個thread去處理多個Client間的通訊了,有時間我在把他實做出來吧!