我从没写过这东西,摸着石头过河 大家指点下//Client
typedef struct 
{
char type;//type=a登陆 //服务器回应:type=b登陆成功,type=c账号或者密码错误,type=d账号已经登陆
char user[20];
char password[20];
}login,*plogin;typedef struct 
{
char type;//type=e注册 //服务器回应:type=f账号已经被注册 type=g注册成功
char name[20];
char user[20];
char password[20];
}userInfo,*puserInfo;typedef struct 
{
char type;//type=h普通消息
char msg[8000];
}message,*pmessage;//type=i请求用户列表
//type=j发送和回应心跳包
///////////////////////////////////////////////////////
//Server
typedef struct 
{
char type;//type=k用户列表
char msg[8000];//格式是张三/李四/……
}userlist,*puserlist;

解决方案 »

  1.   

    定义没有问题,提几个建议:1.char msg[8000]这种定长的最好不要使用,空间和传输耗费太大。
    2.如果你这些结构在C和S端均有声明,且一致,可以不用再声明长度,但是在传输你所定义的msg这种文本时,因为建议你不要采用定长的方式,所以需要添加声明长度。
    3.可以考虑采用包头定义和包体定义分开的方式,不同报文的包头格式均一致,包体不定长。
    4.在包头中最好添加标志字段,以避免小概率事件。
      

  2.   


    非常感谢,受益匪浅你好人帮到低了^^如何做到你说的那种不定长喃?
    就以那个msg为例typedef struct
    {
       char type;
       unsigned short len;
       char *p;
    }这样搞可以吗?再次谢谢
      

  3.   

    就举个例子,不了解你的详细需求,不一定合适:typedef struct _MSG_HEAD_
    {
      char gcHead[2];
      unsigned char ucType;
      unsigned short usLength;
    } MH, * PMH;typedef struct _MSG_SEND_ALL_
    {
      MH mh;
      char * p;
    } MSA, * PMSA;
    发送时,申请一个MSA,发送MSA.mh,再按照MSA.mh.usLength发送MSA.p
    接收时,先判断是否接收长度大于sizeof(MH),再将前面的sizeof(MH)个字节memcpy给一个MH,并按照MH.usLength判断长度是否满足要求。