日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

【Socket网络编程】17. recv() 函数详解

發布時間:2025/3/21 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【Socket网络编程】17. recv() 函数详解 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

recv函數

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

參數說明

  • 第一個參數指定接收端套接字描述符;?
  • 第二個參數指明一個緩沖區,該緩沖區用來存放recv函數接收到的數據;?
  • 第三個參數指明buf的長度;
  • 第四個參數一般置0。
  • 同步Socket的recv函數的執行流程

    當應用程序調用recv函數時:

  • recv先等待 SOCKET?s 的發送緩沖中的數據被協議傳送完畢,如果協議在傳送s的發送緩沖中的數據時出現網絡錯誤,那么recv函數返回SOCKET_ERROR
  • 如果s的發送緩沖區中沒有數據或者數據被協議成功發送完畢后,recv先檢查套接字s的接收緩沖區
  • 如果s的接收緩沖區中沒有數據或者協議正在接收數據,那么recv就一直等待,直到協議把數據接收完畢;
  • 當協議把數據接收完畢,recv函數就把s的接收緩沖區中的數據copy到buf中。(注意協議接收到的數據可能大于buf的長度,所以 在這種情況下要調用幾次recv函數才能把s的接收緩沖中的數據copy完。recv函數僅僅是copy數據,真正的接收數據是協議來完成的), recv函數返回其實際copy的字節數。如果recv在copy時出錯,那么它返回SOCKET_ERROR
  • 如果recv函數在等待協議接收數據時網絡中斷了,那么它返回0。
  • 默認 socket 是阻塞的,阻塞與非阻塞recv()返回值沒有區分,都是

    <0 出錯,
    =0 連接關閉,
    >0 接收到的數據長度大小

    返回值

  • 成功執行時,返回接收到的字節數。
  • 另一端已關閉則返回0。
  • 失敗返回-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提示其再調用一次(也許下次就能成功)。

    ?

    參考:

    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() 函数详解的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。