一区二区三区日韩精品-日韩经典一区二区三区-五月激情综合丁香婷婷-欧美精品中文字幕专区

分享

Socket send函數(shù)和recv函數(shù)詳解

 seedoly 2010-09-10

send函數(shù)

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

      不論是客戶還是服務(wù)器應(yīng)用程序都用send函數(shù)來向TCP連接的另一端發(fā)送數(shù)據(jù)。

      客戶程序一般用send函數(shù)向服務(wù)器發(fā)送請求,而服務(wù)器則通常用send函數(shù)來向客戶程序發(fā)送應(yīng)答。

      該函數(shù)的第一個參數(shù)指定發(fā)送端套接字描述符;

      第二個參數(shù)指明一個存放應(yīng)用程序要發(fā)送數(shù)據(jù)的緩沖區(qū);

      第三個參數(shù)指明實(shí)際要發(fā)送的數(shù)據(jù)的字節(jié)數(shù);

      第四個參數(shù)一般置0。

      這里只描述同步Socket的send函數(shù)的執(zhí)行流程。當(dāng)調(diào)用該函數(shù)時(shí),send先比較待發(fā)送數(shù)據(jù)的長度len和套接字s的發(fā)送緩沖的長度,如果len大于s的發(fā)送緩沖區(qū)的長度,該函數(shù)返回SOCKET_ERROR;如果len小于或者等于s的發(fā)送緩沖區(qū)的長度,那么send先檢查協(xié)議是否正在發(fā)送s的發(fā)送緩沖中的數(shù)據(jù),如果是就等待協(xié)議把數(shù)據(jù)發(fā)送完,如果協(xié)議還沒有開始發(fā)送s的發(fā)送緩沖中的數(shù)據(jù)或者s的發(fā)送緩沖中沒有數(shù)據(jù),那么send就比較s的發(fā)送緩沖區(qū)的剩余空間和len,如果len大于剩余空間大小send就一直等待協(xié)議把s的發(fā)送緩沖中的數(shù)據(jù)發(fā)送完,如果len小于剩余空間大小send就僅僅把buf中的數(shù)據(jù)copy到剩余空間里(注意并不是send把s的發(fā)送緩沖中的數(shù)據(jù)傳到連接的另一端的,而是協(xié)議傳的,send僅僅是把buf中的數(shù)據(jù)copy到s的發(fā)送緩沖區(qū)的剩余空間里)。如果send函數(shù)copy數(shù)據(jù)成功,就返回實(shí)際copy的字節(jié)數(shù),如果send在copy數(shù)據(jù)時(shí)出現(xiàn)錯誤,那么send就返回SOCKET_ERROR;如果send在等待協(xié)議傳送數(shù)據(jù)時(shí)網(wǎng)絡(luò)斷開的話,那么send函數(shù)也返回SOCKET_ERROR。

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

      注意:在Unix系統(tǒng)下,如果send在等待協(xié)議傳送數(shù)據(jù)時(shí)網(wǎng)絡(luò)斷開的話,調(diào)用send的進(jìn)程會接收到一個SIGPIPE信號,進(jìn)程對該信號的默認(rèn)處理是進(jìn)程終止。

recv函數(shù)

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

      不論是客戶還是服務(wù)器應(yīng)用程序都用recv函數(shù)從TCP連接的另一端接收數(shù)據(jù)。

      該函數(shù)的第一個參數(shù)指定接收端套接字描述符;

      第二個參數(shù)指明一個緩沖區(qū),該緩沖區(qū)用來存放recv函數(shù)接收到的數(shù)據(jù);

      第三個參數(shù)指明buf的長度;

      第四個參數(shù)一般置0。

      這里只描述同步Socket的recv函數(shù)的執(zhí)行流程。當(dāng)應(yīng)用程序調(diào)用recv函數(shù)時(shí),recv先等待s的發(fā)送緩沖中的數(shù)據(jù)被協(xié)議傳送完畢,如果協(xié)議在傳送s的發(fā)送緩沖中的數(shù)據(jù)時(shí)出現(xiàn)網(wǎng)絡(luò)錯誤,那么recv函數(shù)返回SOCKET_ERROR,如果s的發(fā)送緩沖中沒有數(shù)據(jù)或者數(shù)據(jù)被協(xié)議成功發(fā)送完畢后,recv先檢查套接字s的接收緩沖區(qū),如果s接收緩沖區(qū)中沒有數(shù)據(jù)或者協(xié)議正在接收數(shù)據(jù),那么recv就一直等待,直到協(xié)議把數(shù)據(jù)接收完畢。當(dāng)協(xié)議把數(shù)據(jù)接收完畢,recv函數(shù)就把s的接收緩沖中的數(shù)據(jù)copy到buf中(注意協(xié)議接收到的數(shù)據(jù)可能大于buf的長度,所以 在這種情況下要調(diào)用幾次recv函數(shù)才能把s的接收緩沖中的數(shù)據(jù)copy完。recv函數(shù)僅僅是copy數(shù)據(jù),真正的接收數(shù)據(jù)是協(xié)議來完成的),recv函數(shù)返回其實(shí)際copy的字節(jié)數(shù)。如果recv在copy時(shí)出錯,那么它返回SOCKET_ERROR;如果recv函數(shù)在等待協(xié)議接收數(shù)據(jù)時(shí)網(wǎng)絡(luò)中斷了,那么它返回0。

      注意:在Unix系統(tǒng)下,如果recv函數(shù)在等待協(xié)議接收數(shù)據(jù)時(shí)網(wǎng)絡(luò)斷開了,那么調(diào)用recv的進(jìn)程會接收到一個SIGPIPE信號,進(jìn)程對該信號的默認(rèn)處理是進(jìn)程終止。

/*******************************************************************************/

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

請問send函數(shù)每次最多可以發(fā)送多少數(shù)據(jù)?是int的最大值嗎?

【sms88】:
不是int的最大值,理論上視乎是一個窗口大小減去協(xié)議頭的大小

【xxyyboy】:
不是, send 有不指定長度的,有指定長度的。
int send (
   SOCKET s,                 //連路
   const char FAR * buf,     //buffer 內(nèi)容
   int len,                   //buffer len
   int flags                 //不知道
);

函數(shù) int 只是表示發(fā)送成功失敗的返回值,不表示多長,像你這個就是有buffer 就發(fā)送
recv到的數(shù)據(jù)流可能是斷斷續(xù)續(xù)的,你要把他們放在一起然后解碼。

【dodoboy】:
那也就是說如果buffer中的數(shù)據(jù)過大,我也只需要調(diào)用一次send函數(shù),而低層到底是一次傳輸成功還是陸續(xù)傳輸我不用管了嗎?

【mudunke775】:
recv到的數(shù)據(jù)流可能是斷斷續(xù)續(xù)的,你要把他們放在一起然后解碼。

//////////////////////////////////////////////////////////////////

解碼和合并包是低層做的,不用你自己解碼吧?

【unsigned】:
Send分為阻塞和非阻塞,阻塞模式下,如果正常的話,會直到把你所需要發(fā)送的數(shù)據(jù)發(fā)完再返回;非阻塞,會根據(jù)你的socket在底層的可用緩沖區(qū)的大小,來將你的緩沖區(qū)當(dāng)中的數(shù)據(jù)拷貝過去,有多大緩沖區(qū)就拷貝多少,緩沖區(qū)滿了就立即返回,這個時(shí)候的返回值,只表示拷貝到緩沖區(qū)多少數(shù)據(jù),但是并不代表發(fā)送多少數(shù)據(jù),同時(shí)剩下的部分需要你再次調(diào)用send才會再一次拷貝到底層緩沖區(qū)。

【iambic】:
和write差不多。

【Arthur_】:
You can use *setsockopt* to enlarge the buffer.

    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多

    欧洲一区二区三区蜜桃| 激情三级在线观看视频| 大香蕉伊人精品在线观看| 国产盗摄精品一区二区视频| 欧美加勒比一区二区三区| 国产又粗又长又大高潮视频| 亚洲国产av在线视频| 日本高清一区免费不卡| 果冻传媒精选麻豆白晶晶 | 国产精品欧美在线观看| 青青操视频在线观看国产| 成年人黄片大全在线观看| 日本福利写真在线观看| 妻子的新妈妈中文字幕| 日韩精品免费一区二区三区 | 东京热一二三区在线免| 日韩一区二区三区高清在| 91亚洲国产成人久久| 日韩精品视频高清在线观看| 儿媳妇的诱惑中文字幕| 老富婆找帅哥按摩抠逼视频| 亚洲中文字幕亲近伦片| 中文字幕日韩一区二区不卡| 可以在线看的欧美黄片| 人妻中文一区二区三区| 亚洲精品国产主播一区| 日本亚洲精品在线观看| 国产激情国产精品久久源| 国内精品一区二区欧美| 日韩亚洲精品国产第二页| 亚洲乱妇熟女爽的高潮片| 精品人妻少妇二区三区| 五月激情综合在线视频| 欧洲偷拍视频中文字幕| av免费视屏在线观看| 国产精品激情在线观看| 好吊日在线观看免费视频| 亚洲中文字幕人妻系列| 大伊香蕉一区二区三区| 男人大臿蕉香蕉大视频| 国产原创激情一区二区三区|