网络传输最重要的事情就是定义通信协议。何谓协议?协议就是通信双方以沟通为目的所做的约定。具体到这里就是定义消息头,这分为两部分,
A - 服务器发往客户端的图像
B - 客户端发往服务器的命令
以下是代码 :
A - 服务器发往客户端的图像
B - 客户端发往服务器的命令
以下是代码 :
#ifndef PacketHead_H
#define PacketHead_H
//
#include <Windows.h>
//
enum
{
STAMP_PACKET = 0xE2DDB090, // 标志戳,用于接收端判断是否是包头
};
enum
{
BOARD_PORT = 7001, // 广播端口
};
//
struct PacketHead
{
DWORD dwStamp; // 标志戳
DWORD dwLength; // 包长度
};
//
enum
{
CTRL_MOUSE = 1, // 鼠标控制信息
CTRL_KEYBOARD = 2, // 键盘控制信息
};
struct RemoteCtrl // 控制包结构
{
DWORD dwCtrl; // 标识鼠标或键盘消息
union
{
struct // 鼠标消息
{
DWORD x; // x 坐标
DWORD y; // y 坐标
DWORD dwFlags; // 按下或松开标志
DWORD dwWidth; // 客户端屏幕宽度
DWORD dwHeight; // 客户端屏幕高度
//由于 CaptureScreen 没有抓到鼠标,为保持控制鼠标坐标精度,发送x,y,width,height,以便在服务器端计算鼠标坐标
};
struct // 键盘消息
{
UINT nChar;
UINT nFlags;
};
};
};
enum
{
MAX_WIDTH = 1280, // 假设服务器屏幕最大宽度
MAX_HEIGHT= 960, // 假设服务器屏幕最大高度
MAX_JPEG_SIZE = MAX_WIDTH * MAX_HEIGHT, // 假设压缩后的 JPG 最大容量
MAX_BITMAP_SIZE = MAX_WIDTH * MAX_HEIGHT * 3 + sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER), // 最大 Bmp 容量
MAX_BUFFER_COUNT= 8, // 缓冲区个数
};
//
//SOCKET_POST 是我写的 IOCP Post 的头, Post 不用我解释了吧?你懂的。
//SOCKET_POST_CTRL 是客户端到服务器的控制消息
struct SOCKET_POST_CTRL : public SOCKET_POST
{
HANDLE hQueue; // 缓冲区队列句柄
// 发送/接收数据的剩余大小
DWORD dwLeftSize; // 对于发送,是指未 IOCP 未发送完的大小,以便调整缓冲区指针再发送, 发送完成 = 0
// 对于接收,是指分析出包大小后,未接收到完整包时可再接收, 接收完成 = 0
DWORD dwRecvFlag; // 用于标识是接收包头还是包数据
WSABUF wsaBuf[1]; // WSABUF 结构,你懂的
PacketHead pktHead; // 包头
RemoteCtrl remoteCtrl;// 包数据
};
//SOCKET_POST_IMAGE 是服务器到客户端的图像消息
struct SOCKET_POST_IMAGE : public SOCKET_POST
{
HANDLE hQueue; // 缓冲区队列句柄
// 发送/接收数据的剩余大小
DWORD dwLeftSize; // 对于发送,是指未 IOCP 未发送完的大小,以便调整缓冲区指针再发送, 发送完成 = 0
// 对于接收,是指分析出包大小后,未接收到完整包时可再接收, 接收完成 = 0
DWORD dwRecvFlag; // 用于标识是接收包头还是包数据
WSABUF wsaBuf[1]; // WSABUF 结构,你懂的
PacketHead pktHead; // 包头
CHAR szBuffer[MAX_JPEG_SIZE];// 包数据
};
//
#endif