关于 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 盘 ,
我建立了两个结构体, 第一个存放上面受控端系统信息,,第二个结构体存放驱动器信息,
这个存放系统信息
这个结构体存放驱动器信息。
send函数 就发送这两个结构体给控制端。
但是控制端使用的是wsaasyncselect()这个I/O模型,它只有在FD_READ 这个网络事件发生时才调用recv函数取得受控端的数据, 取得数据区分不出是 第一个结构体,还是第二个结构体,也就是 分不出收到的信息是系统信息 ,还是受孔端的驱动器信息。
所以我把两个结构体都放在一个结构体中,看下面。
这种方法 虽然解决了前一个问题,但是 这样也有个很大的问题,
比如我定义了PACKETHEAD Head;
Head.type= // 某个值
Head.packetdrive.id=
Head.packetdrive.id1=
...............
send (client,(char *)&Head,sizeof(Head),0); 这样发送的数据值是固定的 ,都是PACKETHEAD这个结构体的大小的值也就是sizeof(PACKETHEAD),这个值 ,这样发送收到的数据量太大。
请问这个怎么解决啊
------解决方案--------------------
你需要在结构体前面多发一个字节表示结构体类型
比如 0xAA+packethead, 0xBB+packetDrive,根据类型来解析
最好还是自己定义一个协议把结构体包在里面
------解决方案--------------------
我要写个 简单的远控 ,一个控制端 可以 控制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,根据类型来解析
最好还是自己定义一个协议把结构体包在里面
------解决方案--------------------