<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>

新聞中心

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

linux內核中send與recv函數詳解

作者: 時(shí)間:2016-11-22 來(lái)源:網(wǎng)絡(luò ) 收藏

1.簡(jiǎn)介

本文引用地址:http://dyxdggzs.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個(gè)參數等同于read和write;
  • flags參數值為0或:

flags說(shuō)明recvsend
MSG_DONTROUTE繞過(guò)路由表查找
MSG_DONTWAIT僅本操作非阻塞
MSG_OOB    發(fā)送或接收帶外數據
MSG_PEEK  窺看外來(lái)消息
MSG_WAITALL  等待所有數據

2. send解析

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

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

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

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

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

5) 如果send函數copy成功,就返回實(shí)際copy的字節數,如果send在copy數據時(shí)出現錯誤,那么send就返回SOCKET_ERROR;如果在等待協(xié)議傳送數據時(shí)網(wǎng)絡(luò )斷開(kāi),send函數也返回SOCKET_ERROR。

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

7) 在unix系統下,如果send在等待協(xié)議傳送數據時(shí)網(wǎng)絡(luò )斷開(kāi),調用send的進(jìn)程會(huì )接收到一個(gè)SIGPIPE信號,進(jìn)程對該信號的處理是進(jìn)程終止。

2.recv解析

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

1) recv先等待sockfd的發(fā)送緩沖區的數據被協(xié)議傳送完畢,如果協(xié)議在傳送sock的發(fā)送緩沖區中的數據時(shí)出現網(wǎng)絡(luò )錯誤,那么recv函數返回SOCKET_ERROR。

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

3) recv函數返回其實(shí)際copy的字節數,如果recv在copy時(shí)出錯,那么它返回SOCKET_ERROR。如果recv函數在等待協(xié)議接收數據時(shí)網(wǎng)絡(luò )中斷了,那么它返回0。

4) 在unix系統下,如果recv函數在等待協(xié)議接收數據時(shí)網(wǎng)絡(luò )斷開(kāi)了,那么調用 recv的進(jìn)程會(huì )接收到一個(gè)SIGPIPE信號,進(jìn)程對該信號的默認處理是進(jìn)程終止。



關(guān)鍵詞: linux內核sendrecv函數詳

評論


技術(shù)專(zhuān)區

關(guān)閉
国产精品自在自线亚洲|国产精品无圣光一区二区|国产日产欧洲无码视频|久久久一本精品99久久K精品66|欧美人与动牲交片免费播放
<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>