本人菜鸟,最近写了C/S的程序,用WINSOCK来写的。就是两个程序运行的UI之间传输数据的问题。基于对话框的窗口里的Edit框里数据传送的问题。
假如我的客户端的界面里有十几个参数,都是在Edit控件里的,要传送到服务器端的对应的界面的EDIT控件里。
首先,这个数据是成批传输的,我是想把客户端界面的EDIT控件的数据全部拿出来,组成数据,一次性的发送到服务器端。那服务器端怎么样一一对应起来,因为服务器端接收了数据之后,要填充到Edit控件里去。
我写了个结构:
struct
{
char * ControlName;
float Data;
}DataBlock;
假如我的客户端的界面里有十几个参数,都是在Edit控件里的,要传送到服务器端的对应的界面的EDIT控件里。
首先,这个数据是成批传输的,我是想把客户端界面的EDIT控件的数据全部拿出来,组成数据,一次性的发送到服务器端。那服务器端怎么样一一对应起来,因为服务器端接收了数据之后,要填充到Edit控件里去。
我写了个结构:
struct
{
char * ControlName;
float Data;
}DataBlock;
{
char * ControlName;
float Data;
}DataBlock; 1.这个结构不应该这样子定,首先,char *ControlName这是一个指针,传输时需要转换为实际的串,而解的时候就麻烦多了,需要进行扫描,一旦ControlName转换为网络流时,忘记了串结束符('\0'),那就无法解出来;其次,考虑到内存字节对齐,这个结构应该是一个八字节结构,并不存在“空隙”,但是毕竟指针不能用于远程操作,所以必须转化为实际的数据,而这个时候,更多的人习惯性直接用ControlName当而串的道指针,这个时候对于数据还源时的位置计算很不利。2.下面是一种个人比较推荐的结构(当然也并不理想):
#pragma pack(push,1)
struct
{
float Data;
int nNameLen;
char ControlName[1];
}DataBlock;
#pragma pack(pop)
对于这个结构,申请结构的时候,就需要知道ControlName的长度,从而整个结构的大小是可变的,并不是sizeof所测试出来的9字节,反而可以任何在可用内存(连续的)当中扩充(可以使用realloc进行扩充,或缩小)。(注:此用法不建议新手使用)3.其实对于ControlName,我们不防理解为一个件控或者控制设备的名称,而名称应该不可能是无限长的,包括显示和打印以及识别的方便,必须要有一个有限的长度,比如255字节,这个是比较推荐的一个最长的长度限制(实际应用当中应该都有一个规则,企业当中品种的名称也会有各自的命名规则),从而可以定义如下的一个结构:
struct
{
char ControlName[68]; //假设这个名称控制在32个汉字以内,那么最长就是64字节,
//为操作方便可以增加一个串结束符('\0')的位置,
//而再考虑8字节内存对齐,并与后面的4字节合并,从而可以定义为68
float Data; //长度为4字节,当然也可以改为双精度(double)型
}DataBlock;