2010年7月14日 星期三

Five pitfalls of Linux sockets programming

http://www.ibm.com/developerworks/linux/library/l-sockpit/

這篇文章是IBM上的devleperWork發表的。主要敘述作linux socket programming所會遇到可能忽略的陷阱。我覺得寫得還算蠻不錯的,就做一下筆記。

Pitfall 1.Ignoring return status
socket programming中做有關IO的動作,都會有牽扯到return status,包含了執行狀態的變化,不單單只有成功與失敗兩種而已。我們在寫程式時有時貪圖一時方便,只檢查有需要的狀態,更甚者完全不檢查。這些行為都不太好。

Pitfall 2. Peer socket closure
這段大概講的是要把正確的行為放在正確的區塊中。像他所舉的範例close(sock);放在status==0,其實可以表示已經讀完了跟對方結束兩種狀態。我想,像我們在寫程式有很多case需要作close之類的動作,應該要注意要放在哪邊才能確定close一次,而不會造成多次close的崩潰或是沒有close的memory leak。

Pitfall 3. Address in use error (EADDRINUSE)
進行Socket連接時,使用SO_REUSEADDR屬性,方便當斷線時進入TIME_WAIT狀態時,位址還可以讓其他人使用。

Pitfall 4. Sending structured data
socket可以傳遞binary的資料,理當來說也可以傳遞結構性資料。但是要注意的是雙方的協定是否正確,像是big-endian和little-endian的問題,以免資料還原時無法讀取。我們可以使用現有的協定,像是RPC這類的傳遞資料。

Pitfall 5. Framing assumptions in TCP
注意雙方的buffer大小,應該要同步,以免作多餘的寫入或傳送的動作。

沒有留言: