【Socket网络编程】17. recv() 函数详解
recv函數(shù)
int recv( SOCKET s, char *buf, int len, int flags);參數(shù)說明
同步Socket的recv函數(shù)的執(zhí)行流程
當(dāng)應(yīng)用程序調(diào)用recv函數(shù)時:
默認 socket 是阻塞的,阻塞與非阻塞recv()返回值沒有區(qū)分,都是
<0 出錯,
=0 連接關(guān)閉,
>0 接收到的數(shù)據(jù)長度大小
返回值
- EAGAIN:套接字已標記為非阻塞,而接收操作被阻塞或者接收超時?
- EBADF:sock不是有效的描述詞?
- ECONNREFUSE:遠程主機阻絕網(wǎng)絡(luò)連接?
- EFAULT:內(nèi)存空間訪問出錯?
- EINTR:操作被信號中斷?
- EINVAL:參數(shù)無效?
- ENOMEM:內(nèi)存不足?
- ENOTCONN:與面向連接關(guān)聯(lián)的套接字尚未被連接上?
- ENOTSOCK:sock索引的不是套接字 當(dāng)返回值是0時,為正常關(guān)閉連接;
特別
返回值<0時并且(errno == EINTR || errno == EWOULDBLOCK || errno == EAGAIN)的情況下認為連接是正常的,繼續(xù)接收。
EAGAIN、EWOULDBLOCK、EINTR與非阻塞
- EWOULDBLOCK:用于非阻塞模式,不需要重新讀或者寫
- EINTR:指操作被中斷喚醒,需要重新讀/寫
如果出現(xiàn)EINTR即errno為4,錯誤描述Interrupted system call,操作應(yīng)該繼續(xù)。
- EAGAIN:Linux - 非阻塞socket編程處理EAGAIN錯誤
在linux進行非阻塞的socket接收數(shù)據(jù)時經(jīng)常出現(xiàn)Resource temporarily unavailable,errno代碼為11(EAGAIN)。從字面上來看,是提示再試一次。這個錯誤經(jīng)常出現(xiàn)在當(dāng)應(yīng)用程序進行一些非阻塞(non-blocking)操作(對文件或socket)的時候。這個錯誤不會破壞socket的同步,不用管它,下次循環(huán)接著recv就可以。
對非阻塞socket而言,EAGAIN不是一種錯誤。在VxWorks和Windows上,EAGAIN的名字叫做EWOULDBLOCK。
例如,以 O_NONBLOCK的標志打開文件/socket/FIFO,如果你連續(xù)做read操作而沒有數(shù)據(jù)可讀。此時程序不會阻塞起來等待數(shù)據(jù)準備就緒返 回,read函數(shù)會返回一個錯誤EAGAIN,提示你的應(yīng)用程序現(xiàn)在沒有數(shù)據(jù)可讀請稍后再試。
又例如,當(dāng)一個系統(tǒng)調(diào)用(比如fork)因為沒有足夠的資源(比如虛擬內(nèi)存)而執(zhí)行失敗,返回EAGAIN提示其再調(diào)用一次(也許下次就能成功)。
?
參考:
https://segmentfault.com/a/1190000003780387
https://blog.csdn.net/haluoluo211/article/details/48381649
https://blog.csdn.net/wm_1991/article/details/51858997
總結(jié)
以上是生活随笔為你收集整理的【Socket网络编程】17. recv() 函数详解的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【Socket网络编程】16.UDP 循
- 下一篇: 【C++】20. const char