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