关于 wsaasyncselect 这个i/o模型的施用

关于 wsaasyncselect 这个i/o模型的使用
我要写个 简单的远控 ,一个控制端 可以 控制n个 受控端,  受控端主动和 控制端的电脑建立连接,
双方会收发各种数据。


控制端和受控端都采用wsaasyncselect()这个 socket I/O模型,

控制端 : WSAAsyncSelect(hSock,hwnd,RATMSG_SOCKET,FD_ACCEPT|FD_CLOSE|FD_READ);  可以看出控制端查看 接受,读和 关闭 套接字的 网络事件

受控端 :       WSAAsyncSelect(client,hwnd,RATMSG_SOCKET,FD_READ|FD_CLOSE|FD_CONNECT);
  而受控端  查看是否 有   连接、 读、和关闭网络事件。

现在问题是:  受控端发送的数据不同 ,比如 : 1、受控端系统的信息, ip地址,用户名,操作系统版本等,  2、驱动器信息,a盘 ,b盘 c 盘   ,
我建立了两个结构体,  第一个存放上面受控端系统信息,,第二个结构体存放驱动器信息,

struct  
{
char    ID[10]; //用户ID
char    UserName[20];//用户名
char Buf2 [25];//用户等级
char PRIORITY [25];//用户IP
char    Threads [25];//操作系统版本
char    Data [25];//内存容量
char Buf3 [25]; //cpu
char Buf [25];  //屏幕尺寸
char PID [25];//服务端版本 
}PacketHead;
  
这个存放系统信息

struct 
{
int ID;
int ID1;
char Data[10];

}PacketDrive;

这个结构体存放驱动器信息。
send函数 就发送这两个结构体给控制端。

但是控制端使用的是wsaasyncselect()这个I/O模型,它只有在FD_READ 这个网络事件发生时才调用recv函数取得受控端的数据, 取得数据区分不出是 第一个结构体,还是第二个结构体,也就是 分不出收到的信息是系统信息 ,还是受孔端的驱动器信息。
所以我把两个结构体都放在一个结构体中,看下面。
typedef  struct 
{
char     Type;//不同的值区分不同的结构体 
union{
struct  
{
char    ID[10]; //用户ID
char    UserName[20];//用户名
char Buf2 [25];//用户等级
char PRIORITY [25];//用户IP
char    Threads [25];//操作系统版本
char    Data [25];//内存容量
char Buf3 [25]; //cpu
char Buf [25];  //屏幕尺寸
char PID [25];//服务端版本 
}PacketHead;
struct 
{
int ID;//受控端编号
int ID1;//   驱动器盘符类型 比如  光盘 u盘  ,可移动硬盘  系统中普通 c d e  f 盘
char Data[10];//驱动器盘符  比如 a  c d  e  f 盘

}PacketDrive;
}ucontent;
} PACKETHEAD;


这种方法 虽然解决了前一个问题,但是 这样也有个很大的问题,
比如我定义了PACKETHEAD  Head;
    Head.type=  // 某个值 
  Head.packetdrive.id=
  Head.packetdrive.id1=
  ...............
  send (client,(char *)&Head,sizeof(Head),0);  这样发送的数据值是固定的 ,都是PACKETHEAD这个结构体的大小的值也就是sizeof(PACKETHEAD),这个值 ,这样发送收到的数据量太大。

请问这个怎么解决啊 

   

------解决方案--------------------
你需要在结构体前面多发一个字节表示结构体类型
比如 0xAA+packethead, 0xBB+packetDrive,根据类型来解析
最好还是自己定义一个协议把结构体包在里面
------解决方案--------------------