本人菜鸟,最近写了C/S的程序,用WINSOCK来写的。就是两个程序运行的UI之间传输数据的问题。基于对话框的窗口里的Edit框里数据传送的问题。
假如我的客户端的界面里有十几个参数,都是在Edit控件里的,要传送到服务器端的对应的界面的EDIT控件里。
首先,这个数据是成批传输的,我是想把客户端界面的EDIT控件的数据全部拿出来,组成数据,一次性的发送到服务器端。那服务器端怎么样一一对应起来,因为服务器端接收了数据之后,要填充到Edit控件里去。
我写了个结构:
struct
{
   char * ControlName;
   float Data;
}DataBlock;

解决方案 »

  1.   

    struct 

          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;