请问在网络编程中用recv来接收数据,怎么辨别接受完成呢?
我用
nRet = recv(Socket, szBuffer, sizeof(szBuffer), 0);
if (nRect==0){..............}
来辨别,不过似乎不太准确,有时行,有时不行~~~
问题点数:20、回复次数:6Top
1 楼coffeefish(咖啡鱼)回复于 2002-05-07 22:08:54 得分 0
用異步方式來執行Top
2 楼xuying()回复于 2002-05-07 22:17:40 得分 20
TCP是流式的,对端发送来的数据可能需要调用多次recv才能接收完,因此需要自己定义格式,一般是一个结构,比如前n个字节定义长度,用某个特殊字节表示结束等方法来辨别数据是否发送完毕。Top
3 楼depotmen(嘻嘻哈哈)回复于 2002-05-07 22:26:44 得分 0
哦,也就是说没有固定的格式喽?如果自己编写发送端的话就自己定义格式,是这个意思吗?Top
4 楼limin(www.haha567.com)回复于 2002-05-07 22:55:56 得分 0
有个办法你可以试一下,首先我们提出一个假设,假设我们的缓冲区大小1024字节,如果一次接收完成,那么接收到的字节数,也就是recv的返回值肯定小于等于1024,但是如果一次没有接收完,那么接收到的字节数肯定等于1024。
如果这个假设成立了,那么就好办了。
1、接收,recv返回值为num
2、if (num==SOCKET_ERROR) 表示没有接收的了,或者上次都接收完了
else
if (num==1024) 转1 表示刚好接收完,或者没有接收完
else 不用说了,肯定接收完了Top
5 楼xuying()回复于 2002-05-07 23:02:16 得分 0
是的,发送端要自定义格式。Top
6 楼depotmen(嘻嘻哈哈)回复于 2002-05-07 23:05:13 得分 0
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();
}Top
7 楼depotmen(嘻嘻哈哈)回复于 2002-05-07 23:07:52 得分 0
只有SERVER端断开连接,client端才会num==SOCKET_ERRORTop




