關於 recv函數()函數

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

(1)recv先等待s的發送緩衝中的數據被協議傳送完畢,
如果協議在傳送s的發送緩衝中的數據時出現網絡錯誤,那麼recv函數返回SOCKET_ERROR,

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

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

int CSocketEX::RecvCommand(SOCKET socket,char* buf,int bytes)
{

char* szRecv =(char*)buf;
while(bytes > 0)
{
    int nRet = recv(socket,szRecv,bytes,0);
    if (nRet < 0)
    {
        return 0;
    }
    else if (nRet == 0)
    {
        break; // 網絡中斷 這裏表示對端的socket已正常關閉.
    }
    bytes = bytes - nRet;
    szRecv = szRecv  +nRet; 
}

return szRecv - (char*)buf;

}


本文來自 威少mvp 的CSDN 博客 ,全文地址請點擊:https://blog.csdn.net/djb100316878/article/details/52386580?utm_source=copy

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章