socket讀寫返回值的處理

2021-10-03 22:40:07 字數 1078 閱讀 7305

在呼叫socket讀寫函式read(),write()時,都會有返回值。如果沒有正確處理返回值,就可能引入一些問題

總結了以下幾點

1當read()或者write()函式返回值大於0時,表示實際從緩衝區讀取或者寫入的位元組數目

2當read()函式返回值為0時,表示對端已經關閉了 socket,這時候也要關閉這個socket,否則會導致socket洩露。netstat命令檢視下,如果有closewait狀態的socket,就是socket洩露了

當write()函式返回0時,表示當前寫緩衝區已滿,是正常情況,下次再來寫就行了。

3當read()或者write()返回-1時,一般要判斷errno

如果errno == eintr,表示系統當前中斷了,直接忽略

如果errno == eagain或者ewouldblock,非阻塞socket直接忽略;如果是阻塞的socket,一般是讀寫操作超時了,還未返回。這個超時是指socket的so_rcvtimeo與so_sndtimeo兩個屬性。所以在使用阻塞socket時,不要將超時時間設定的過小。不然返回了-1,你也不知道是socket連線是真的斷開了,還是正常的網路抖動。一般情況下,阻塞的socket返回了-1,都需要關閉重新連線。

4.另外,對於非阻塞的connect,可能返回-1.這時需要判斷errno,如果 errno == einprogress,表示正在處理中,否則表示連線出錯了,需要關閉重連。之後使用select,檢測到該socket的可寫事件時,要判斷getsockopt(c->fd, sol_socket, so_error, &err, &errlen),看socket是否出錯了。如果err值為0,則表示connect成功;否則也應該關閉重連

5 在使用epoll時,有et與lt兩種模式。et模式下,socket需要read或者write到返回-1為止。對於非阻塞的socket沒有問題,但是如果是阻塞的socket,正如第三條中所說的,只有超時才會返回。所以在et模式下千萬不要使用阻塞的socket。那麼lt模式為什麼沒問題呢?一般情況下,使用lt模式,我們只要呼叫一次read或者write函式,如果沒有讀完或者沒有寫完,下次再來就是了。由於已經返回了可讀或者可寫事件,所以可以保證呼叫一次read或者write會正常返回。

socket讀寫返回值的處理

在呼叫socket讀寫函式read write 時,都會有返回值。如果沒有正確處理返回值,就可能引入一些問題 總結了以下幾點 1當read 或者write 函式返回值大於0時,表示實際從緩衝區讀取或者寫入的位元組數目 2當read 函式返回值為0時,表示對端已經關閉了 socket,這時候也要關閉這...

socket程式設計 recv 返回值處理

一般在經典的socket教程中,呼叫send 和recv 時都會判斷一下返回值,如果返回值是 1 或者socket error 那麼就進行錯誤處理 一般是列印出錯資訊,關閉socket,退出 在我的乙個專案中我因為嫌麻煩就想當然沒有判斷send和recv的返回值,結果遇到了點小麻煩。簡單地說明一下問...

Flex TitleWindow返回值處理

flex有2 中彈出視窗 alert.show 和通過 popupmanager 產生出來的彈出視窗,其中 alert 我們可以稱之為彈出對話方塊主要用於資訊提示,而用 popupmanager 產生出來的彈出視窗才是本文需要討論的議題。1 彈出視窗如何彈出 移除 利用 popupmanager 可...