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