现在的位置: 首页 > 综合 > 正文

自己写远程控制软件之网络传输

2013年04月28日 ⁄ 综合 ⁄ 共 1984字 ⁄ 字号 评论关闭

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

抱歉!评论已关闭.