采用UDP接收的原型函数为
int recvfrom(SOCKET s,
char FAR* buff,
int len,
int flags,
struct sockaddr FAR* from,
 int FAR* fromlen);
也就是用char型的进行接收,如果同一个端口会有两种类型的数据包传过来,如下
//A结构体
struct A
{
int nFrameBegin;
int id;  //id=1为A
int num;
double a[MaxNum];  //num<MaxNum;
int nFrameEnd;
};
//B结构体
struct B
{
int nFrameBegin;
int id;   //id=2为B;
int num;
int b[MaxNum];   //num<MaxNum
int nFrameEnd;
};
通过id来确定到底是哪种数据包。
编程时,怎么把内容解析出来?求助。

解决方案 »

  1.   

    定义一个结构体的指针,如果都在同一种cpu下,又都是同一种exe,比如都是vc编译的32位程序,可以用结构体指针直接指向接收到的数据,然后可以按结构去转化。
      

  2.   

    加个识别头结构
    struct DataHead
    {
    int type;
    //...
    };
    发送时将DataHead结构放到Data前面发送(作一个包发送) 接收时先接收DataHead,再根据DataHead中标示接收后面的Data
      

  3.   

    如果识别结构和data放在两个包里面,连续发送,UDP会不会出现包之间的顺序错乱的情况.那么就无法进行解析了
      

  4.   


     
    首先不应该把int id;放在每个结构体内,这样区分起来很麻烦,按照你的思路:
    假设接收到消息 char * pmsg = "消息体"
    你需要转换两次
      struct A *pa = (struct A)pmsg;
        struct B  *pb;
        //开始判断
        if (pa->id == 1 )
       {
          //dosomething
        }
        if ((pa->id !==2 )
      {
         pb = (struct B *)pmsg;
         //dosomething
       }
    而加个消息头后,假设消息头定义如下
     typedef   struct __MSGHEAD
        {
          int nLen;//消息总长度
          int id;//消息标识
        }MSGHEAD,* LPMSGHEAD;  LPMSGHEAD lpmsghead = (LPMSGHEAD)pmsg;
      if (接收的长度 != lpmsghead->nLen )
       //接收错误
      if ( lpmsghead->id == 1 )
      {
        pa = (struct A *)(pmsg + sizeof(MSGHEAD));
    //do something
      }
      else if (  lpmsghead->id == 2 )
      {
            pb = (struct B *)(pmsg + sizeof(MSGHEAD));
    //do something
    }
      else 
      //非法消息
      

  5.   

    定义为结构里包含一个联合类型就可以了啊struct AB
    {
        int nFrameBegin;
        int id;   //id=2为B;
        int num;
        union
         {
           int b[MaxNum];   //num<MaxNum
           double a[MaxNum];  //num<MaxNum
        }
        int nFrameEnd;
    };
      

  6.   

    根据id判断类型转换成你想要的数据就可以了,
    这就已经解析完了啊。
    打个广告181245517 it技术论坛
    欢迎加入讨论
      

  7.   

    既然是char,那直接判断字符串第二个位置?然后存入不同的结构体~~
      

  8.   

    看你两个结构图前三个参数类型都一样,可以先收两个或者3*sizeof(int)长度的数据,这个数据里肯定包含了id,读出id,这样就能判断时能struct A还是struct B了,确定了这个在根据struct A或是struct B的总长,再剩余的长度