网络传输最重要的事情就是定义通信协议。何谓协议?协议就是通信双方以沟通为目的所做的约定。具体到这里就是定义消息头,这分为两部分,
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