自己寫遠端控制軟體之網路傳輸

LiuYinChina發表於2013-01-31
網路傳輸最重要的事情就是定義通訊協議。何謂協議?協議就是通訊雙方以溝通為目的所做的約定。具體到這裡就是定義訊息頭,這分為兩部分,
       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


相關文章