1. 程式人生 > >recv( )函式返回值說明

recv( )函式返回值說明

recv函式

int recv( SOCKET s, char FAR *buf, int len, int flags);

引數說明

  1. 第一個引數指定接收端套接字描述符; 
  2. 第二個引數指明一個緩衝區,該緩衝區用來存放recv函式接收到的資料; 
  3. 第三個引數指明buf的長度;
  4. 第四個引數一般置0。

同步Socket的recv函式的執行流程

當應用程式呼叫recv函式時:

  1. recv先等待 SOCKET s 的傳送緩衝中的資料被協議傳送完畢,如果協議在傳送s的傳送緩衝中的資料時出現網路錯誤,那麼recv函式返回SOCKET_ERROR
  2. 如果s的傳送緩衝區沒有資料或者資料被協議成功傳送完畢
    後,recv先檢查套接字s的接收緩衝區
  3. 如果s的接收緩衝區沒有資料或者協議正在接收資料,那麼recv就一直等待,直到協議把資料接收完畢;
  4. 當協議把資料接收完畢,recv函式就把s的接收緩衝區中的資料copy到buf中。(注意協議接收到的資料可能大於buf的長度,所以 在這種情況下要呼叫幾次recv函式才能把s的接收緩衝中的資料copy完。recv函式僅僅是copy資料,真正的接收資料是協議來完成的), recv函式返回其實際copy的位元組數。如果recv在copy時出錯,那麼它返回SOCKET_ERROR
  5. 如果recv函式在等待協議接收資料時網路中斷了,那麼它返回0。

預設 socket 是阻塞的,阻塞與非阻塞recv返回值沒有區分,都是 <0 出錯 =0 連線關閉 >0 接收到資料大小。

返回值

  1. 成功執行時,返回接收到的位元組數。
  2. 另一端已關閉則返回0。
  3. 失敗返回-1,errno被設為以下的某個值 :
  • 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提示其再呼叫一次(也許下次就能成功)。

參考:

相關推薦

recv函式返回總結

函式原型:int recv( SOCKET s, char *buf, int  len, int flags) 功能:不論是客戶還是伺服器應用程式都用recv函式從TCP連線的另一端接收資料。 引數一:指定接收端套接字描述符; 引數二:指明一個緩衝區,該緩衝區用來存放recv

recv函式返回說明

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

recv( )函式返回說明

recv函式 int recv( SOCKET s, char FAR *buf, int len, int flags); 引數說明 第一個引數指定接收端套接字描述符;  第二個引數指明一個緩衝區,該緩衝區用來存放recv函式接收到的資料;  第三個引數指明b

socket, recv函式返回說明

1.建立socket int udp_socket = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);  //IPPROTO_UDP表示UDP協議int tcp_socket = socket(AF_INET, SOCK_STREAM,

網路程式設計read, write, recv, send函式返回

1.1    read >0 : 正常情況下返回讀入的位元組數,read 讀取資料時有水位控制,當可讀資料大於水位時,就返回。 =0 : 當關閉socket連線時且緩衝區中沒資料可讀時,返回0;當檔案操作時,讀取到檔案尾EOF,也返回0 <0 :當read 失敗

【VS開發】recv函式函式返回說明(特別有利於工程除錯)

當返回值是0時,為正常關閉連線; windows版本: 第四個引數: MSG_PEEK 檢視當前資料。資料將被複制到緩衝區中,但並不從輸入佇列中刪除。 MSG_OOB 處理帶外資料(參見2.2.3節具體討論)。 返回值: 若無錯誤發生,recv()返回讀入的位元組數。如果連線已中止,返回0。否則的

Python小白學習之路(十)—【函式】【函式返回】【函式引數】

寫在前面: 昨天早睡之後,感覺今天已經恢復了百分之八十的樣子 又是活力滿滿的小夥郭 今日份雞湯: 我始終相信,在這個世界上,一定有另一個自己,在做著我不敢做的事,在過著我想過的生活。-------宮崎駿 函式 一、函數出現的背景 在學習函式之前,一直遵循:面向過程程式設計,即:根據業務邏輯從上到

C# socket 程式設計之 accept() 函式返回解析

accept() 函式會返回一個新的套接字,這個新的套接字在伺服器端與客戶端進行通訊。 伺服器端的繫結監聽是一個套接字,與客戶端通訊的是另一個套接字(accept函式返回的套接字,注意這裡不是返回客戶端的套接字,返回的套接字是新建立在伺服器上的,與客戶端收發訊息用的) 下面這段程式碼,是

opencv之type()函式返回對應表

opencv之type()函式返回值對應表 cv::Mat 類的物件有一個成員函式 type() 用來返回矩陣元素的資料型別,返回值是 int 型別,不同的返回值代表不同的型別。 int Mat::type() const 返回值與具體型別對應關係表: | |C1| C2| C3| C4| --|--|

建構函式返回

建構函式返回值 For purposes other than simple initialization, classes can have constructors. Constructors are blocks of statements that can be used to in

按鍵精靈Q語言-怎麼使用自定義函式返回

按鍵精靈怎麼使用自定義函式返回值? a i MessageBox i Function a(i) i=100 End Function 就是想彈出100 aiMessageBoxiFunctiona(i)i=100EndFunction就是想讓它彈出的是100怎麼獲得自定義函式中的值呢?...展

風火程式設計--flask檢視函式返回

flask檢視函式返回json資料 原始模式 data_json = json.dumps({"errcode": "0", "errms": "成功", "data": data}) return data_json, 200, {"Contant-Type": "Applic

C++ 引用作為函式返回

(1)以引用返回函式值,定義函式時需要在函式名前加 & (2)用引用返回一個函式值的最大好處是,在記憶體中不產生被返回值的副本。 引用作為返回值,必須遵守以下規則: (1)不能返回區域性變數的引用。主要原因是區域性變數會在函式返回後被銷燬,因此被返回的引用就成為了

函式的文件說明,函式引數,函式返回

def test(a,b): … “用來完成對2個數求和” … print("%d"%(a+b)) … test(11,22) 33 如果執行,以下程式碼 h

引用作為函式返回的分析

  例如,下面的程式是有關引用返回的4種形式:     //*********************     //**   ch9_6.cpp  **     //*******************

solidity智慧合約[28]-函式返回

函式返回值一般形式 12345678910 function  resValue() pure public returns(uint){    uint a = 10;    return a;}function &nb

Python函式中的變數和函式返回

1.函式的變數 區域性變數和全域性變數: Python中的任何變數都有特定的作用域 在函式中定義的變數一般只能在該函式內部使用,這些只能在程式的特定部分使用的變數我們稱之為區域性變數 在一個檔案頂部定義的變數可以供檔案中的任何函式呼叫,這些可以為整個程式所使用的變數稱為全域性變數。

Java函式返回的“魔術”轉型

先看一段程式碼: public Object get(String name) {   return map.get(name); } 其中獲取的返回值,可能是字串,也可能是數字等等。那麼呼叫它的程式碼,可能就充斥著各種各樣的轉型: String value1 = (String)get

函式返回案例

//求2個數字的差的function getNumber(num1,num2) { return num1-num2;}console.log(getNumber(10,20));//求一組數字中的最大值function getMax(num) { 定義變數假設這個值是最大值 var max

Typescript | 箭頭函式返回

/* * @Author: AK-12 * @Date: 2018-11-01 20:07:29 * @Last Modified by: AK-12 * @Last Modified time: 2018-11-01 22:00:41 */ import IBlock from '.