我主要是想知道如何有效的封装结构体通过网络发送,接受到可以正常解析出。//一般的做法是定义一个结构体,里面不能包括指针成员如这下面这样的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#中所用到的反射,可以运行时分析出类的成员类型,如果能做到这点
我才能实现动态的发送结构体,而不需要预先知道这个结构的定义.
{
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#中所用到的反射,可以运行时分析出类的成员类型,如果能做到这点
我才能实现动态的发送结构体,而不需要预先知道这个结构的定义.
在消息中包含域(也就是字段)和域快的概念。在服务器和客户端维护一张域表。
在域表中规定类型,比如消息头中 3=1024,3就是域名,3的含义是长度,类型是int,
3的值是1024,意思是消息长度为1024。
每个结构对应一个域块,这样发送的数据中其实包含了字段类型长度的信息,只不过这个信息
要另外解析一下而已。
利用xml也可以,但为了保证带宽和高效,一般网络信息交换协议都是tag=value的格式。