#define NAME_LEN 128
#define DATA_LEN 256

#pragma region Simple communication protocol

#pragma pack(push)
#pragma pack(1)
typedef enum
{
	//////////////////////////////////////////////////////////////////////////
	// 服务端：发出劫持消息;		客户端返回：成功/失败
	S2C_INJECT,
	// 服务端：发出恢复消息;		客户端返回：成功/失败;
	S2C_EJECT,
	//\ 服务端：发出Connect消息;		客户端返回：成功/失败;
	S2C_CONNECT,
	//\ 服务端：发出Disconnect消息;		客户端返回：成功/失败;
	S2C_DISCONNECT,
	//\ 服务端：发出CheckFW消息;		客户端返回：成功/失败;
	S2C_CHECKFW,
	//\ 服务端：发出Go消息;				客户端返回：成功/失败;
	S2C_GO,

	//////////////////////////////////////////////////////////////////////////
	// 客户端：响应服务器S2C_INJECT；
	C2S_INJECT,
	// 客户端：响应服务器S2C_INJECT；
	C2S_EJECT,
	// 客户端：发出Disconnect触发结果;
	C2S_DISCONNECT,
	// 客户端：发出Connect触发结果;成功/失败;
	C2S_CONNECT,
	// 客户端：发出CheckFW触发结果; 成功/失败;	（成功->服务端读取当前版本）;
	C2S_CHECKFW,
	// 客户端：发出Go触发结果;成功/失败; 成功->耗时值、输出目录
	C2S_GO,
	// 客户端：产生异常时通知服务端结束程序;
	C2S_EXCEPTION,
};

typedef struct _MSG_INFO_
{
	// 客户端ID;
	DWORD	dwClientId;
	// 客户端名称;
	TCHAR	szClientName[NAME_LEN];
	// 按钮执行结果;
	BYTE	byResult;
	// 按钮数据;
	BYTE	byData[DATA_LEN];
	_MSG_INFO_()
	{
		byResult = 0;
		dwClientId = 0;
		memset(byData, 0, DATA_LEN);
		memset(szClientName, 0, sizeof(TCHAR)*NAME_LEN);
	}
}MSG_INFO,*LPMSG_INFO;

typedef struct _HEADER_
{
	// 协议标识符;
	BYTE	byProtocol;
	// 整个协议包长度;
	DWORD	dwPackageLen;
	// 消息类型;
	BYTE	byMsgType;
	_HEADER_()
	{
		byProtocol = 0xAC;
		dwPackageLen = sizeof(_HEADER_) + sizeof(MSG_INFO);
		byMsgType = 0;
	}
}DATAHEADER, *LPDATAHEADER;

// 请求包
typedef struct _PACKAGE_ {
	DATAHEADER	header;
	//BYTE		buf[4]; // 具体内容(指针地址);
	LPVOID		buf;
}PACKAGE, *LPPACKAGE;

#pragma pack(pop)
#pragma endregion 简单通信协议