我主要是想知道如何有效的封装结构体通过网络发送,接受到可以正常解析出。//一般的做法是定义一个结构体,里面不能包括指针成员如这下面这样的struct NetPackPS
{
   int  Age;
   bool Sex;        //true is a man or is a women
   char name[20];  //这里的CHAR不能用字符串指针,否则无法解析!
                   //正因为是这样,就会浪费网络封包的长度,比如一段描述信息,可能上千个字,也
                   //有可能只有几个字符,如果用char数组的话,定义char n[1000];如果这段描述只有几
                   //字,也会占用1000个字节的网络资源,起不是很浪费?
}以上这样定义,发送的时候直接 NetPackPS npp; send( SOCKET, (const char*)&npp, sizeof(npp), 0)这样就行了但是有问题1、也就是说如果发送结构体就把定死了格式,如果以后要添加新的东西,那又得更新这块代码,是很麻烦的2、对于字符串变量如果定义成数组势必会浪费带宽的,因为大小有固定
   //我想了吓这种方式实现,动态的发送各种结构,但不知可行不可行
   /*
       先定义一个结构表示,下一个结构的总字节占多大,然后再接受继续相应的结构体
   */   //首先要接收的结构
   strcut NetType{
    int nt;
   }   //然后可以选择性的接收以下结构体
   strcut Pack1{
      int a, b,c;
      char c1,c2;
   }
   strcut Pack2{
     int x,y;
   }
   //当我在客户端接收的时候,按照顺序来接收再分析
   
   NetType nt;
   recv(skt, (char*)&nt, sizeof(nt),0);   switch( nt.nt )
   {
     case 1:
      {
           Pack1 p;
           recv( skt, (char*)&p, sizeof(p),0);
      }
     break;
     case 2:
      {
            Pack2 p;
            recv( skt, (char*)&p, sizeof(p), 0 );
      }
      break;
   }   //我感觉 这样可实现,发送方和接收方预先定义好的结构,以前可以添加N种类型来动态的发送,
   //但这样的也没有解决上面所说的那个问题,就是如果更改的话,两边都需要更新,也要添加额外的代码
   //就是发送代码块和接收代码块不能封闭,添加一次结构就需要在switch里面去添加一个case;
   //我不知道C++ 为什么没有像C#,JAVA那样动态的获取类型。 
第一个问题,没有办法动态化我想不到其它方法解决,只好修改一次就硬着头皮每个地方去改一次第二个问题,那个字符串动态的长度如何让接收方识别呢?难道说是,要先发送一个类型与长度,表明接下来这个字符串
有多少个字符,再分配相应的长度,但是结于一个结构体来说,可能有多个这样的成员,非要在每一个结构里面实现每个成员,不同的发送和接收方式?这样的做法太疯狂了.
  strcut NetType{
   int type;
   int size;
  }  NetType nt;
  recv( skt, (char*)&nt, sizeof(nt), 0 );
  //也就是说我每接一个字段都需要来判断一吓,接下来这个字段是什么类型和有多长,  if( nt.type == 1 )//假为1 表示字符串
  {
     char* pC = new char[nt.size];
     recv( skt, pC, nt.size, 0 ); //每次接收动态类型的时候都需要这样子做!!
   }else if( nt.type == 2 )
   {
                 //2表示int型
    int n;
     recv( skt, (char*)&n, sizeof(n), 0 );
   }......//还有其它类型。。
 我想达到的目的是,做一个底层的发送类,只需要先这个类传递一个结构体,那么这类会完成相应的发送
和也可以接收分析。 只要做好这个底层类以后只需要添加新的结构体,而不是每次都来更改这个底层的发送类
关键是现在,我不能动态的分析出,它是什么类型,它包括着什么成员,除非我预先知道你会传给我什么类型的结构
 我才知道怎么处理这个结构,也就是C#中所用到的反射,可以运行时分析出类的成员类型,如果能做到这点
我才能实现动态的发送结构体,而不需要预先知道这个结构的定义.

解决方案 »

  1.   

    网络封包发送要制定协议的。比如定义消息头、消息体、消息尾的格式,
    在消息中包含域(也就是字段)和域快的概念。在服务器和客户端维护一张域表。
    在域表中规定类型,比如消息头中 3=1024,3就是域名,3的含义是长度,类型是int,
    3的值是1024,意思是消息长度为1024。
    每个结构对应一个域块,这样发送的数据中其实包含了字段类型长度的信息,只不过这个信息
    要另外解析一下而已。
      

  2.   


    利用xml也可以,但为了保证带宽和高效,一般网络信息交换协议都是tag=value的格式。
      

  3.   

    LZ可以找个现成的网络信息交换协议学习一下,例如 FIX(金融信息交换协议)
      

  4.   

    建议楼主看看google protobuf自己写协议有很多细节需要考虑,如不同平台的时候,结构体对齐等等....