亚洲精品久久久久久第一页-人妻少妇精彩视品一区二区三区-91国产自拍免费视频-免费一级a在线播放视频正片-少妇天天日天天射天天爽-国产大屁股喷水视频在线观看-操美女骚穴抽插性爱视频-亚洲 欧美 中文字幕 丝袜-成人免费无码片在线观看

淺析其原因及對應(yīng)解決措施 socket接收數(shù)據(jù)不完整( 二 )


補充一點,接收BuffSize >= 發(fā)送BuffSize >= 實際發(fā)送Size,對于內(nèi)外部的Buffer都適用,上面講的主要是Socket內(nèi)部的Buffer大小關(guān)系 。
3、TCP是有多少就收多少,如果沒有當(dāng)然阻塞Socket的recv就會等,直到有數(shù)據(jù),非阻塞Socket不好等,而是返回WSAEWOULDBLOCK 。UDP,如果沒有數(shù)據(jù),阻塞Socket就會等,非阻塞Socket也返回WSAEWOULDBLOCK 。如果有數(shù)據(jù),它是會等整個發(fā)包到齊,并接收到整個發(fā)包,才返回 。
send函數(shù)
1 int send( SOCKET s,const char* 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ù)指明實際要發(fā)送的數(shù)據(jù)的字節(jié)數(shù);
第四個參數(shù)一般置0 。
這里只描述同步Socket的send函數(shù)的執(zhí)行流程 。當(dāng)調(diào)用該函數(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ù)成功,就返回實際copy的字節(jié)數(shù),如果send在copy數(shù)據(jù)時出現(xiàn)錯誤,那么send就返回SOCKET_ERROR;如果send在等待協(xié)議傳送數(shù)據(jù)時網(wǎng)絡(luò)斷開的話,那么send函數(shù)也返回SOCKET_ERROR 。
要注意send函數(shù)把buf中的數(shù)據(jù)成功copy到s的發(fā)送緩沖的剩余空間里后它就返回了,但是此時這些數(shù)據(jù)并不一定馬上被傳到連接的另一端 。如 果協(xié)議在后續(xù)的傳送過程中出現(xiàn)網(wǎng)絡(luò)錯誤的話,那么下一個Socket函數(shù)就會返回SOCKET_ERROR 。(每一個除send外的Socket函數(shù)在執(zhí) 行的最開始總要先等待套接字的發(fā)送緩沖中的數(shù)據(jù)被協(xié)議傳送完畢才能繼續(xù),如果在等待時出現(xiàn)網(wǎng)絡(luò)錯誤,那么該Socket函數(shù)就返回 SOCKET_ERROR)
注意:在Unix系統(tǒng)下,如果send在等待協(xié)議傳送數(shù)據(jù)時網(wǎng)絡(luò)斷開的話,調(diào)用send的進(jìn)程會接收到一個SIGPIPE信號,進(jìn)程對該信號的默認(rèn)處理是進(jìn)程終止 。
recv函數(shù)
1 int recv( SOCKET s,char* 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ù)時,recv先等待s的發(fā)送緩沖 中的數(shù)據(jù)被協(xié)議傳送完畢,如果協(xié)議在傳送s的發(fā)送緩沖中的數(shù)據(jù)時出現(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ù)返回其實際copy的字節(jié)數(shù) 。如果recv在copy時出錯,那么它返回SOCKET_ERROR;如果recv函數(shù)在等待協(xié)議接收數(shù)據(jù)時網(wǎng)絡(luò)中斷了,那么它返回0 。


以上關(guān)于本文的內(nèi)容,僅作參考!溫馨提示:如遇健康、疾病相關(guān)的問題,請您及時就醫(yī)或請專業(yè)人士給予相關(guān)指導(dǎo)!

「愛刨根生活網(wǎng)」www.malaban59.cn小編還為您精選了以下內(nèi)容,希望對您有所幫助: