请问在网络编程中用recv来接收数据,怎么辨别接受完成呢? TCP是流式的,对端发送来的数据可能需要调用多次recv才能接收完,因此需要自己定义格式,一般是一个结构,比如前n个字节定义长度,用某个特殊字节表示结束等方法来辨别数据是否发送完毕。 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 有个办法你可以试一下,首先我们提出一个假设,假设我们的缓冲区大小1024字节,如果一次接收完成,那么接收到的字节数,也就是recv的返回值肯定小于等于1024,但是如果一次没有接收完,那么接收到的字节数肯定等于1024。如果这个假设成立了,那么就好办了。1、接收,recv返回值为num2、if (num==SOCKET_ERROR) 表示没有接收的了,或者上次都接收完了 else if (num==1024) 转1 表示刚好接收完,或者没有接收完 else 不用说了,肯定接收完了 1、if (num==SOCKET_ERROR) 表示没有接收的了,或者上次都接收完了这条好象有点问题,我试了试,接受完了,num也不会等于SOCKET_ERROR,具体的代码如下:nRet = send(Socket, szBuffer, strlen(szBuffer), 0); if (nRet == SOCKET_ERROR) { PRINTERROR("send()"); closesocket(Socket); return; } while(1) { nRet = recv(Socket, szBuffer, sizeof(szBuffer), 0); if (nRet == SOCKET_ERROR) { cout <<'nRet==SOCKET_ERRO'; break; } cout <<szBuffer; } closesocket(Socket); WSACleanup();} 只有SERVER端断开连接,client端才会num==SOCKET_ERROR 号被盗!! CStatic 显示图片 一个比较耗费资源的桌面程序,请问各位思路 实现周期执行特定程序. SetParent解决.急救 动态库问题!! IE中使用的控件如何屏蔽IE的刷新、后退功能? 初学者的问题,initinstance and exitinstance 如何记录键盘钩子 如何使图标适应按钮大小 combo box问题 都说看MSDN很有用!那么大家是怎么利用MSDN的?怎么看才是有效的?
如果这个假设成立了,那么就好办了。
1、接收,recv返回值为num
2、if (num==SOCKET_ERROR) 表示没有接收的了,或者上次都接收完了
else
if (num==1024) 转1 表示刚好接收完,或者没有接收完
else 不用说了,肯定接收完了
这条好象有点问题,我试了试,接受完了,num也不会等于SOCKET_ERROR,具体的代码如下:nRet = send(Socket, szBuffer, strlen(szBuffer), 0);
if (nRet == SOCKET_ERROR)
{
PRINTERROR("send()");
closesocket(Socket);
return;
}
while(1) {
nRet = recv(Socket, szBuffer, sizeof(szBuffer), 0);
if (nRet == SOCKET_ERROR)
{
cout <<'nRet==SOCKET_ERRO';
break;
} cout <<szBuffer;
}
closesocket(Socket); WSACleanup();
}