recvfrom接收数据的时候如何判断已经接收完了??

flyingjm 2004-11-08 11:05:58
1 服务器端发送的数据是不定长的,每个包的长度不超过1500字节
2 有的包可能不到1000字节,就直接发送过去,有的大于1500的就分包,所以每个包没有固定的长度的。
在客户端怎么知道一个包已经接受完了呢?
问题:
1 不想让服务器通过发送消息来通知客户端,因为不想再改包的格式了,:(
2 好像有个函数可以提前窥测一下,但是好像代价挺大的,一般不建议用,是这样吗?

3 如果数据已经收完了,但是客户端不知道,而再次调用recvfrom,这时候WSAGetLastError()会返回0的错误,这个0是什么意思呢?另外可不可以通过这个来判断已经收完了,不过这样就必须多调用一次recvfrom了!!!
4 还有其他的方法吗?
...全文
687 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
whwjn 2004-11-11
  • 打赏
  • 举报
回复
我是这么理解的:
举个例子,如果udp包大于1472字节,比如是一次发送1600字节,到了ip层会分包,到了接收方ip层传到udp层的包要么是什么都不收不到,要么就是一次接收了1600字节,就是说ip层会负责分包和组包。

发送:
sendto(s,buf,1600,....);

接收:
char buf[4096];
int ret;
ret=recvfrom(s,buf,4096,...);
ASSERT(ret==1600);
worlftki 2004-11-11
  • 打赏
  • 举报
回复
你可以复习一下以太网基础,你当然可以大于1514,但网卡就给你拆了。真要让实际帧长度大于1514,你必须有网卡协议的巨帧支持,当然中间转发设备也必须支持才行。比如,另装intel的网卡驱动,使用北电的380 24-T交换机。
dongle2001 2004-11-11
  • 打赏
  • 举报
回复
是不是用udp如果包小于1500,则要么全收不到,要么收到的话是一次全受到,那如果包大于1500呢?
flyingjm 2004-11-11
  • 打赏
  • 举报
回复
我是将大于1500的包都拆分成小包再发送了。
arvid_gs 2004-11-09
  • 打赏
  • 举报
回复
int nRecvSize = 0;
m_Socket.Recv(&nRecvSize, sizeof(int));
int nRecvCount = 0;
int nLeftSize = nRecvSize;
int nRecv = 0;
while(nRecvCount < nRecvSize)
{
nRecv = m_Socket.Recv(pDataBuf, nLeftSize);
nRecvCount += nRecv;
nLeftSize -= nRecv;
pDataBuf += nRecv;
}
whwjn 2004-11-08
  • 打赏
  • 举报
回复
用异步模型来做
flyingjm 2004-11-08
  • 打赏
  • 举报
回复
明白了
刚才翻书了,没有找到:(
silverwgy 2004-11-08
  • 打赏
  • 举报
回复
UDP可以保证你一个包内容能完全接收.
但不能保证丢包.
sunhuiNO1 2004-11-08
  • 打赏
  • 举报
回复
对UDP是如此。
flyingjm 2004-11-08
  • 打赏
  • 举报
回复
to: sunhuiNO1(2B)
你的意思是要么全收不到,要么收到的话是一次全受到吗?
flyingjm 2004-11-08
  • 打赏
  • 举报
回复
to: sunhuiNO1(2B)
我很弱的,能不能讲详细点?
Jimmy_Xia 2004-11-08
  • 打赏
  • 举报
回复
接收方参考代码:
...
int nRecvSize = 0;
m_Socket.Recv(&nRecvSize, sizeof(int));
int nRecvCount = 0;
int nLeftSize = nRecvSize;
int nRecv = 0;
while(nRecvCount < nRecvSize)
{
nRecv = m_Socket.Recv(pDataBuf, nLeftSize);
nRecvCount += nRecv;
nLeftSize -= nRecv;
pDataBuf += nRecv;
}
...
sunhuiNO1 2004-11-08
  • 打赏
  • 举报
回复
UDP是数据报,可以保证数据的边界性,难道书里这个都没有?
sunhuiNO1 2004-11-08
  • 打赏
  • 举报
回复
udp是数据报,可以保证数据完整性和边界性,这个书里没有?
Jimmy_Xia 2004-11-08
  • 打赏
  • 举报
回复
参考代码如下:
...
int nSize = MY_DATA_SIZE;
m_Socket.Send(&nSize, sizeof(nSize));
//发送数据
m_Socket.Send(pData, MY_DATA_SIZE);
...
Jimmy_Xia 2004-11-08
  • 打赏
  • 举报
回复
在发送真正的数据之前先发送4字节的包头信息,表示本次数据发送的大小。
flyingjm 2004-11-08
  • 打赏
  • 举报
回复
恳求牛人指点一下!!
一个包最大1400字节,有什么好的办法没有?
flyingjm 2004-11-08
  • 打赏
  • 举报
回复
我是在线程里接受数据的,是不是没有必要用异步模型?
flyingjm 2004-11-08
  • 打赏
  • 举报
回复
to:sunhuiNO1(2B)
没记得书上有啊
sunhuiNO1 2004-11-08
  • 打赏
  • 举报
回复
这个建议你看看TCP/IP的基础书把,

18,356

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 网络编程
c++c语言开发语言 技术论坛(原bbs)
社区管理员
  • 网络编程
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧