非阻塞socket總結(jié)

非阻塞socket設(shè)置方法:

fcntl(socket_fd, F_SETFL,? fcntl (socket_fd, F_GETFL,0) | O_NONBLOCK);

非阻塞模式下錯誤處理:

EAGAIN和EWOULDBLOCK(windows下)錯誤,這表明你在非阻塞模式下調(diào)用了阻塞操作,在該操作沒有完成就返回這個錯誤,關(guān)于此錯誤一種說法是此錯誤表示目前無端口可用,另一種說法說的是發(fā)送緩沖區(qū)已滿,遇到這兩種錯誤不能當(dāng)作錯誤處理,一種處理方法是采用延時處理稍后發(fā)送/接收,另一種是在類似poll/select/epoll中繼續(xù)監(jiān)聽下次繼續(xù)發(fā)送/接收,很顯然第一種方法不可取,影響性能。當(dāng)發(fā)送大量數(shù)據(jù)時,可以通過緩存保存數(shù)據(jù)。如果出現(xiàn)EINTR錯誤,錯誤描述為Interrupted system call,操作也應(yīng)該繼續(xù)。如果recv的返回值為0,那表明連接已經(jīng)斷開,我們的接收操作也應(yīng)該結(jié)束。

發(fā)送數(shù)據(jù):

阻塞與非阻塞send返回值沒有區(qū)分,

<0,出錯,

=0,連接關(guān)閉,

>0,發(fā)送數(shù)據(jù)大小。

非阻塞模式下返回值?<0時并且(errno?==?EINTR?||?errno?==?EWOULDBLOCK?||?errno?==?EAGAIN)的情況下認(rèn)為連接是正常的, 繼續(xù)發(fā)送。

阻塞模式下send會阻塞著發(fā)送數(shù)據(jù),非阻塞模式下如果暫時無法發(fā)送數(shù)據(jù)會返回,不會阻塞著?send,因此需要循環(huán)發(fā)送。

接收數(shù)據(jù):

阻塞與非阻塞recv返回值沒有區(qū)分,

<0,出錯,

=0,連接關(guān)閉,

>0,接收到數(shù)據(jù)大小,

非阻塞模式下返回 值?<0時并且(errno?==?EINTR?||?errno?==?EWOULDBLOCK?||?errno?==?EAGAIN)的情況 下認(rèn)為連接是正常的,繼續(xù)接收。

阻塞模式下recv會阻塞著接收數(shù)據(jù),非阻塞模式下如果沒有數(shù)據(jù)會返回,不會阻塞著讀,因此需要?循環(huán)讀取。

連接:

TCP socket 被設(shè)為非阻塞后調(diào)用 connect ,connect 函數(shù)如果沒有馬上成功,會立即返回EINPROCESS(如果被中斷返回EINTR) ,但 TCP 的 3 次握手還在繼續(xù)進(jìn)行。之后可以用 select /epoll檢查連接是否建立成功(但不能再次調(diào)用connect,這樣會返回錯誤EADDRINUSE)。

非阻塞 connect 有3 種用途:

(1). 在3 次握手的同時做一些其他的處理。

(2). 可以同時建立多個連接。

(3). 在利用 select/epoll 等待的時候,可以給 select/epoll 設(shè)定一個時間,從而可以縮短 connect 的超時時間。

使用非阻塞 connect 需要注意的問題是:

(1). 很可能 調(diào)用 connect 時會立即建立連接(比如,客戶端和服務(wù)端在同一臺機(jī)子上),必須處理這種情況。

(2). Posix 定義了兩條與 select/epoll 和 非阻塞 connect 相關(guān)的規(guī)定:

連接成功建立時,socket 描述字變?yōu)榭蓪?。(連接建立時,寫緩沖區(qū)空閑,所以可寫)

連接建立失敗時,socket 描述字既可讀又可寫。 (由于有未決的錯誤,從而可讀又可寫)

另外對于無連接的socket類型(SOCK_DGRAM),客戶端也可以調(diào)用connect進(jìn)行連接,此連接實(shí)際上并不建立類似SOCK_STREAM的連接,而僅僅是在本地保存了對端的地址,這樣后續(xù)的讀寫操作可以默認(rèn)以連接的對端為操作對象。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容