局域网UDP传输,数据包不定长的有关问题

局域网UDP传输,数据包不定长的问题?
对方发给我的包分两种类型,一种是命令,一种是数据,二者的长度是不同的,命令只有一个数据包(<1000字节,长度不定),数据可能分多个包。现在只是在发送的时候在头部加了标记,来区分命令和数据(如果是数据,头部还包含了总包数/当前包序号)~

问题是:在接收线程中,如何知道应该接收多少个字节?即不知道来的是命令还是数据,

C/C++ code
while(true)
{
   sock.Recvie(buf,num_bytes,SOCK_DGRM);   // 怎么知道这里num_bytes该接多少呢?正在处理的时候,来新包怎办?
   // 判断头,根据类型取出对应数据,再做其他处理...
}


没怎么接触过,求指点~思路、链接、代码片段~

------解决方案--------------------
这个buf一般会定义为最大的UPD发送包大小. 假如你有任何一个地方会存在 send(buf, 64K, ...)的话, 那么相应的recv就必须定义一个64K大小的buf来接收数据. 这个是按最大包大小来定的.
------解决方案--------------------
阻塞还是非阻塞?
最好在包头里带上数据长度
------解决方案--------------------
UDP包头中是带有本次包的长度的,楼主在接收的时候可以先判断此次接收包的长度,然后再使用while()循环接收,直到长度接收够
------解决方案--------------------
#3楼 得分:0回复于:2012-05-29 09:39:47UDP包头中是带有本次包的长度的,楼主在接收的时候可以先判断此次接收包的长度,然后再使用while()循环接收,直到长度接收够 

------解决方案--------------------
健议使用UDX可靠传输协议,可联系我。
------解决方案--------------------
这就要涉及流化,如同TCP,如果你流化成功后,你可以获取任意长度的数据。比如,四字节的长度。



但是流化后,就会存在粘包问题。

你要解决的是灵活的分包,合并包的机制,才能流化,从而可以取得任意思长度,比如1字节,或四字节的长度,从而可以得到所有你想要的数据。

UDX协议是一套我开发了5,6年的UDP可靠协议,支持流化,流式,包式方式工作,让开发人员,对这些细节不用关心,效率高,丢包少。

你可以和我一起交流,一起进步,共同提高,UDX的网址www.goodudx.com

你的问题要从你最基本实现开始。
------解决方案--------------------
你命令为什么要非定长啊。而且这么长的命令。
你应该加包头 + 序列号+长度
因为你是UDP
------解决方案--------------------
你可以在包头注明长度啊