新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > linux內核中send與recv函數詳解

        linux內核中send與recv函數詳解

        作者: 時間:2016-11-22 來源:網絡 收藏

        1.簡介

        本文引用地址:http://www.104case.com/article/201611/320010.htm
        [plain]view plaincopy
        print?
        1. #include
        2. ssize_trecv(intsockfd,void*buff,size_tnbytes,intflags);
        3. ssize_tsend(intsockfd,constvoid*buff,size_tnbytes,intflags);

        • send和recv的前3個參數等同于read和write;
        • flags參數值為0或:

        flags說明recvsend
        MSG_DONTROUTE繞過路由表查找
        MSG_DONTWAIT僅本操作非阻塞
        MSG_OOB    發送或接收帶外數據
        MSG_PEEK  窺看外來消息
        MSG_WAITALL  等待所有數據

        2. send解析

        • sockfd:指定發送端套接字描述符。
        • buff: 存放要發送數據的緩沖區
        • nbytes: 實際要改善的數據的字節數
        • flags: 一般設置為0

        1) send先比較發送數據的長度nbytes和套接字sockfd的發送緩沖區的長度,如果nbytes > 套接字sockfd的發送緩沖區的長度, 該函數返回SOCKET_ERROR。

        2) 如果nbtyes <= 套接字sockfd的發送緩沖區的長度,那么send先檢查協議是否正在發送sockfd的發送緩沖區中的數據,如果是就等待協議把數據發送完,如果協議還沒有開始發送sockfd的發送緩沖區中的數據或者sockfd的發送緩沖區中沒有數據,那么send就比較sockfd的發送緩沖區的剩余空間和nbytes。

        3) 如果 nbytes > 套接字sockfd的發送緩沖區剩余空間的長度,send就一起等待協議把套接字sockfd的發送緩沖區中的數據發送完。

        4) 如果 nbytes < 套接字sockfd的發送緩沖區剩余空間大小,send就僅僅把buf中的數據copy到剩余空間里(注意:并不是send把套接字sockfd的發送緩沖區中的數據傳到連接的另一端的,而是協議傳送的。send僅僅是把buf中的數據copy到套接字sockfd的發送緩沖區的剩余空間里)。

        5) 如果send函數copy成功,就返回實際copy的字節數,如果send在copy數據時出現錯誤,那么send就返回SOCKET_ERROR;如果在等待協議傳送數據時網絡斷開,send函數也返回SOCKET_ERROR。

        6) send函數把buff中的數據成功copy到sockfd的發送緩沖區的剩余空間后它就返回了,但是此時這些數據并不一定馬上被傳到連接的另一端。如果協議在后續的傳送過程中出現網絡錯誤的話,那么下一個socket函數就會返回SOCKET_ERROR(每一個除send的socket函數在執行的最開始總要先等待套接字的發送緩沖區中的數據被協議傳遞完畢才能繼續,如果在等待時出現網絡錯誤那么該socket函數就返回SOCKET_ERROR)。

        7) 在unix系統下,如果send在等待協議傳送數據時網絡斷開,調用send的進程會接收到一個SIGPIPE信號,進程對該信號的處理是進程終止。

        2.recv解析

        • sockfd: 接收端套接字描述符
        • buff: 用來存放recv函數接收到的數據的緩沖區
        • nbytes: 指明buff的長度
        • flags: 一般置為0

        1) recv先等待sockfd的發送緩沖區的數據被協議傳送完畢,如果協議在傳送sock的發送緩沖區中的數據時出現網絡錯誤,那么recv函數返回SOCKET_ERROR。

        2) 如果套接字sockfd的發送緩沖區中沒有數據或者數據被協議成功發送完畢后,recv先檢查套接字sockfd的接收緩沖區,如果sockfd的接收緩沖區中沒有數據或者協議正在接收數據,那么recv就一起等待,直到把數據接收完畢。當協議把數據接收完畢,recv函數就把sockfd的接收緩沖區中的數據copy到buff中(注意:協議接收到的數據可能大于buff的長度,所以在這種情況下要調用幾次recv函數才能把sockfd的接收緩沖區中的數據copy完。recv函數僅僅是copy數據,真正的接收數據是協議來完成的)。

        3) recv函數返回其實際copy的字節數,如果recv在copy時出錯,那么它返回SOCKET_ERROR。如果recv函數在等待協議接收數據時網絡中斷了,那么它返回0。

        4) 在unix系統下,如果recv函數在等待協議接收數據時網絡斷開了,那么調用 recv的進程會接收到一個SIGPIPE信號,進程對該信號的默認處理是進程終止。



        評論


        技術專區

        關閉
        主站蜘蛛池模板: 广德县| 沂源县| 札达县| 集贤县| 苏州市| 萨迦县| 浦城县| 无为县| 奉节县| 开鲁县| 如东县| 江油市| 旬邑县| 五常市| 桦南县| 双辽市| 梅河口市| 黎川县| 长沙市| 嘉禾县| 巢湖市| 翼城县| 玛多县| 岑巩县| 浏阳市| 瑞安市| 原平市| 巧家县| 霍林郭勒市| 栾川县| 双江| 双牌县| 潼关县| 永和县| 商水县| 山丹县| 望奎县| 普兰店市| 登封市| 灵山县| 重庆市|