亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來(lái)到蟲(chóng)蟲(chóng)下載站! | ?? 資源下載 ?? 資源專輯 ?? 關(guān)于我們
? 蟲(chóng)蟲(chóng)下載站

?? server.c

?? 《Visual C++網(wǎng)絡(luò)通信編程實(shí)用案例精選》配套源碼
?? C
?? 第 1 頁(yè) / 共 3 頁(yè)
字號(hào):
//服務(wù)器端:發(fā)送本機(jī)桌面到連接的客戶端
#include <winsock2.h>
#include <stdio.h>
#include <stdlib.h>
#include <winuser.h>
#include "Server.h"
#include "Command.h"
#include "Gdi.h"
#include "HuffCompress.h"
#include "RLE.h"
//默認(rèn)端口
#define DEFAULT_PORT        5150
#define SETFLAGS			XP1_GUARANTEED_DELIVERY|XP1_GUARANTEED_ORDER
#define NOTSETFLAGS			XP1_CONNECTIONLESS
#define	LPBMIH				LPBITMAPINFOHEADER

UINT    gPort  = DEFAULT_PORT;
int		nGridX = 8;
int		nGridY = 2;
DWORD	dwLen,dwCompress,dwSendLen;
int		iCompressionLevel = 10;
HWND	hServerWnd;
HDC		hDDC = NULL,hMemDC,hNullDC;
BOOL	fChange = FALSE;
SOCKET	Socket;
SOCKET	Listen;
int		iWidth,iHeight;
WORD	bmBitsPixel = 4;
// 指向全局位圖
BOOL	fDIBitmap = FALSE;

// GDI區(qū)域結(jié)構(gòu)
struct	GdiList	GdiStart;
struct	GdiList	*pGdiNode;

// 這個(gè)結(jié)構(gòu)用來(lái)在LPARAM參數(shù)中傳遞信息到客戶端線程
struct	myStruct
{
	SOCKET	Socket;
	HWND	hWnd;
};

int SelectProtocols(DWORD dwSetFlags,DWORD dwNotSetFlags,LPWSAPROTOCOL_INFO lpProtocolBuffer,LPDWORD lpdwBufferLength,WSAPROTOCOL_INFO *pProtocol);

//LoadWinsock用來(lái)裝載和初始化Winsock,綁定本地地址,創(chuàng)建監(jiān)聽(tīng)socket,等候客戶端連接
DWORD WINAPI LoadWinsock(LPVOID lpParam)
{
	// 協(xié)議變量
	LPBYTE				pBuf;
	WSAPROTOCOL_INFO	Protocol;
	int					nRet;
	int					nZero = 0;

	int					iAddrSize;
	HANDLE				hThread;
	DWORD				dwThreadId;
	char				szClientIP[81];
	char				szString[255];
	struct	sockaddr_in	local,client;
	// 這個(gè)結(jié)構(gòu)用來(lái)在LPARAM參數(shù)中傳遞信息到客戶端線程
	struct	myStruct	myStructure;

	// 為協(xié)議的選擇和所有協(xié)議的變量決定需要的緩沖區(qū)的大小
	dwLen = 0;
	nRet = WSAEnumProtocols(NULL,NULL,&dwLen);
	if (nRet == SOCKET_ERROR)
	{
		if (WSAGetLastError() != WSAENOBUFS)
			return 1;
	}
	pBuf = malloc(dwLen);
	// 為WSASocketGet()得到協(xié)議
	nRet = SelectProtocols(SETFLAGS,NOTSETFLAGS,(LPWSAPROTOCOL_INFO)pBuf,&dwLen,&Protocol);

	// 創(chuàng)建我們的監(jiān)聽(tīng)socket
	Listen = WSASocket(AF_INET,SOCK_STREAM,IPPROTO_IP,NULL,0,SOCK_STREAM);
	if (Listen == SOCKET_ERROR)
	{
		sprintf(szString,"socket() failed: %d",WSAGetLastError());
		MessageBox(NULL,szString,"Remote Server",MB_OK);
		return 1;
	}

	// 設(shè)置server端信息
	local.sin_addr.s_addr = htonl(INADDR_ANY);
	local.sin_family = AF_INET;
	local.sin_port = htons(gPort);

	// 綁定到socket
	if (bind(Listen,(struct sockaddr *)&local,sizeof(local)) == SOCKET_ERROR)
	{
		sprintf(szString,"bind() failed: %d\n", WSAGetLastError());
		MessageBox(NULL,szString,"Remote Server",MB_OK);
		return 1;
	}

	//為了減小CPU的利用率,禁止在socket上將數(shù)據(jù)發(fā)送到緩沖。設(shè)置SO_SNDBUF為0,
	//從而使winsock直接發(fā)送數(shù)據(jù)到客戶端,而不是將數(shù)據(jù)緩沖才發(fā)送。
	nZero = 0;
	setsockopt(Listen,SOL_SOCKET,SO_SNDBUF,(char *)&nZero,sizeof(nZero));
	//開(kāi)始監(jiān)聽(tīng)
	listen(Listen,SOMAXCONN);

	iAddrSize = sizeof(client);
	while (TRUE)
	{
		// 阻塞方式的接收客戶端的連接,但因?yàn)檫@是一個(gè)線程函數(shù),所以用戶不會(huì)感到阻塞
		Socket = accept(Listen,(struct sockaddr *)&client,&iAddrSize);
		if (Socket != INVALID_SOCKET)
		{
			// 設(shè)置傳到客戶端線程的信息的數(shù)據(jù)結(jié)構(gòu)
			myStructure.Socket = Socket;
			myStructure.hWnd = hServerWnd;
			//找出客戶端的IP地址
			memset(szClientIP,'\0',sizeof(szClientIP));
			sprintf(szClientIP,"%s",inet_ntoa(client.sin_addr));
			// 為每一個(gè)客戶端創(chuàng)建一個(gè)線程
			hThread = CreateThread(NULL,0,ClientThread,(LPVOID)&myStructure,0,&dwThreadId);
			if (hThread)
			{
				//關(guān)閉線程句柄
				CloseHandle(hThread);
			}
		}
		else
			return 1;
	}

	return 0;
}


//客戶端線程函數(shù),這個(gè)函數(shù)等候從客戶端程序發(fā)送過(guò)來(lái)的消息,
//如果這個(gè)消息是"REFRESH",那么它發(fā)送當(dāng)前的桌面圖片
//如果這個(gè)消息是"DISCONNECT",那么它結(jié)束和客戶端的連接
//如果這個(gè)消息以"WM_"開(kāi)頭,那么它就根據(jù)消息類型,在服務(wù)器端執(zhí)行該消息
DWORD WINAPI ClientThread(LPVOID lpParam)
{
	HWND	hWnd;
	SOCKET	MySocket;
	FD_SET	SocketSet;
	struct	timeval	timeout;
	char	szMessage[2049];
	DWORD	iRecv;
	struct	myStruct	*myStructure;
	DWORD	iLength;
	DWORD	iRet;
	int		iUpdates;

	// 分析參數(shù)
	myStructure = (struct myStruct *)lpParam;
	MySocket = myStructure->Socket;
	hWnd = myStructure->hWnd;

	// 設(shè)置超時(shí)值
	timeout.tv_sec = 0;		// 秒
	timeout.tv_usec = 0;	// 微秒

	// 設(shè)置Socket集合
	SocketSet.fd_count = 1;
	SocketSet.fd_array[1] = MySocket;

	// 輪詢sockets
	while(TRUE)
	{
		// 等候發(fā)送過(guò)來(lái)的數(shù)據(jù)直到超時(shí)
		iRet = select(0,&SocketSet,NULL,NULL,&timeout);
		if (iRet != 0)
		{
 			//初始化緩沖
			memset(szMessage,'\0',sizeof(szMessage));
			// 阻塞方式調(diào)用recv()
			iRecv = recv(MySocket,szMessage,2048,0);
			szMessage[iRecv] = '\0';

			CHECK_MSG:
			// 是不是"REFRESH"消息
			if (strncmp(szMessage,"REFRESH",7) == 0)
			{
				// 捕獲并且發(fā)送桌面的更新的區(qū)域
				iUpdates = SendRegionDisplay(hServerWnd,MySocket);
			}
			
			// 檢查從客戶端發(fā)送過(guò)來(lái)的Windows 命令消息,這是一個(gè)核心部分
			else if (strncmp(szMessage,"WM_",3) == 0)
			{
				// 解析從客戶端發(fā)送過(guò)來(lái)的消息并發(fā)送到本機(jī)的消息隊(duì)列
				DispatchWMMessage(szMessage);

				// 看看是否還有消息
				iLength = strlen(szMessage);
				if (iLength > 0)
					goto CHECK_MSG;
			}
			// 檢查是否是查詢消息
			else if (strncmp(szMessage,"RESOLUTION",10) == 0)
			{
				SendResolution(MySocket);
			}
			// 檢查是否是DISCONNECT消息
			else if (strncmp(szMessage,"DISCONNECT",10) == 0)
			{
				fChange = FALSE;
				fDIBitmap = FALSE;

				pGdiNode = GdiStart.pNext;
				while (pGdiNode)
				{
					free(pGdiNode->Gdi.pDIBitmap);
					free(pGdiNode->Gdi.pDIBChangeStart);
					pGdiNode->Gdi.fDIBitmap = FALSE;
					pGdiNode->Gdi.fChange = FALSE;
					pGdiNode = pGdiNode->pNext;
				}
				// 停止查詢,相當(dāng)于結(jié)束該線程
				break;
			}
		}
	}
	closesocket(MySocket);
	return 0;
}

// 解析從客戶端發(fā)送過(guò)來(lái)的消息并發(fā)送到本機(jī)的消息隊(duì)列
void DispatchWMMessage(char *szString)
{
	//鼠標(biāo)消息
	struct {char *szWMMouseMsg;} 
	WMMouseMsg[] = {"WM_MM","WM_LBD","WM_LBU","WM_LBK",
					"WM_MBD","WM_MBU","WM_MBK",
					"WM_RBD","WM_RBU","WM_RBK"};

	// 鍵盤(pán)消息
	struct {char *szWMKeyBdMsg;}
	WMKeyBdMsg[] = {"WM_KD","WM_KU"};

	// 通用消息:色彩模式,網(wǎng)格數(shù)和壓縮消息
	struct {char *szMsg;}
	Msg[] = {"WM_COMP","WM_GRID","WM_CMOD"};

	int		nWMMouseMsg;
	int		nWMKeyBdMsg;
	int		nMsg;

	struct	CommandList	CommandStart;
	struct	CommandList	*pCommandNode;
	struct	CommandDS	Command;
	char	*pDest;
	int		iLoc,nChar;
	int		iLoop,iParms;
	char	szString2[2049];

	// 分別得到鼠標(biāo),鍵盤(pán),通用消息的數(shù)目
	nWMMouseMsg = (int)(sizeof(WMMouseMsg)/sizeof(WMMouseMsg[0]));
	nWMKeyBdMsg = (int)(sizeof(WMKeyBdMsg)/sizeof(WMKeyBdMsg[0]));
	nMsg = (int)(sizeof(Msg)/sizeof(Msg[0]));

	// 初始化command鏈表
	CommandStart.pNext = NULL;
	pCommandNode = &CommandStart;

	// 分析command命令,截獲命令的參數(shù)
	iParms = 0;
	while (pDest = strchr(szString,';'))
	{
		iLoc = pDest - szString;
		nChar = iLoc;
		memset(Command.szElement,'\0',sizeof(Command.szElement));
		strncpy(Command.szElement,szString,nChar);
		// 發(fā)送到命令棧中
		pCommandNode = Add_Command(pCommandNode,Command);
		memset(szString2,'\0',sizeof(szString2));
		strcpy(szString2,&szString[iLoc + 1]);
		strcpy(szString,szString2);

		iParms++;
		if (iParms == 5) // 每條命令5個(gè)參數(shù)
			break;
	}

	// 處理命令
	pCommandNode = CommandStart.pNext;
	if (pCommandNode)
	{
		// 鼠標(biāo)消息
		UINT	keyFlags;
		int		iMessage;
		int		fWMMouseMsg;
		double	iScaleX,iScaleY,iX,iY;
		DWORD	dwX,dwY;

		// 鍵盤(pán)消息
		int		fWMKeyBdMsg;
		UINT	vk;
		int		fDown;
		int		cRepeat;
		UINT	flags;

		// 判斷是否有鼠標(biāo)消息
		fWMMouseMsg = FALSE;
		for (iLoop = 0;iLoop < nWMMouseMsg;iLoop++)
		{
			if (strcmp(pCommandNode->Command.szElement,WMMouseMsg[iLoop].szWMMouseMsg) == 0)
			{
				// 設(shè)置鼠標(biāo)消息的標(biāo)志
				fWMMouseMsg = TRUE;
				// 具體的鼠標(biāo)消息
				if (strcmp(WMMouseMsg[iLoop].szWMMouseMsg,"WM_MM\0") == 0)
					iMessage = 1;
				else if (strcmp(WMMouseMsg[iLoop].szWMMouseMsg,"WM_LBD\0") == 0)
					iMessage = 2;
				else if (strcmp(WMMouseMsg[iLoop].szWMMouseMsg,"WM_LBU\0") == 0)
					iMessage = 3;
				else if (strcmp(WMMouseMsg[iLoop].szWMMouseMsg,"WM_LBK\0") == 0)
					iMessage = 4;
				else if (strcmp(WMMouseMsg[iLoop].szWMMouseMsg,"WM_MBD\0") == 0)
					iMessage = 5;
				else if (strcmp(WMMouseMsg[iLoop].szWMMouseMsg,"WM_MBU\0") == 0)
					iMessage = 6;
				else if (strcmp(WMMouseMsg[iLoop].szWMMouseMsg,"WM_MBK\0") == 0)
					iMessage = 7;
				else if (strcmp(WMMouseMsg[iLoop].szWMMouseMsg,"WM_RBD\0") == 0)
					iMessage = 8;
				else if (strcmp(WMMouseMsg[iLoop].szWMMouseMsg,"WM_RBU\0") == 0)
					iMessage = 9;
				else if (strcmp(WMMouseMsg[iLoop].szWMMouseMsg,"WM_RBK\0") == 0)
					iMessage = 10;

				// 移動(dòng)到參數(shù)棧的下一個(gè)節(jié)點(diǎn),x坐標(biāo)
				pCommandNode = pCommandNode->pNext;
				iX = atof(pCommandNode->Command.szElement);

				// 移動(dòng)到參數(shù)棧的下一個(gè)節(jié)點(diǎn),y坐標(biāo)
				pCommandNode = pCommandNode->pNext;
				iY = atof(pCommandNode->Command.szElement);

				// 移動(dòng)到參數(shù)棧的下一個(gè)節(jié)點(diǎn),輔助鍵
				pCommandNode = pCommandNode->pNext;
				keyFlags = atoi(pCommandNode->Command.szElement);

				// 退出循環(huán)
				break;
			}
		}

		// 如果有鼠標(biāo)消息則對(duì)鼠標(biāo)消息進(jìn)行處理
		if (fWMMouseMsg)
		{
			// 得到坐標(biāo)的范圍因子
			iScaleX = 65535.0 / (iWidth - 1);
			iScaleY = 65535.0 / (iHeight - 1);
			// 對(duì)坐標(biāo)進(jìn)行比例縮放
			iX *= iScaleX;
			iY *= iScaleY;
			// 轉(zhuǎn)換成DWORDS
			dwX = (DWORD)iX;
			dwY = (DWORD)iY;

			// 處理鼠標(biāo)消息
			if (iMessage == 1) 
			{
				mouse_event(MOUSEEVENTF_ABSOLUTE|MOUSEEVENTF_MOVE,dwX,dwY,0,0);
			}
			else if (iMessage == 2) 
			{
				mouse_event(MOUSEEVENTF_ABSOLUTE|MOUSEEVENTF_LEFTDOWN,dwX,dwY,0,0);
			}
			else if (iMessage == 3) 
			{
				mouse_event(MOUSEEVENTF_ABSOLUTE|MOUSEEVENTF_LEFTUP,dwX,dwY,0,0);
			}
			else if (iMessage == 4) 
			{
				mouse_event(MOUSEEVENTF_ABSOLUTE|MOUSEEVENTF_LEFTDOWN,dwX,dwY,0,0);
				mouse_event(MOUSEEVENTF_ABSOLUTE|MOUSEEVENTF_LEFTUP,dwX,dwY,0,0);
				mouse_event(MOUSEEVENTF_ABSOLUTE|MOUSEEVENTF_LEFTDOWN,dwX,dwY,0,0);
				mouse_event(MOUSEEVENTF_ABSOLUTE|MOUSEEVENTF_LEFTUP,dwX,dwY,0,0);
			}
			else if (iMessage == 5) 
			{
				mouse_event(MOUSEEVENTF_ABSOLUTE|MOUSEEVENTF_MIDDLEDOWN,dwX,dwY,0,0);
			}
			else if (iMessage == 6) 
			{
				mouse_event(MOUSEEVENTF_ABSOLUTE|MOUSEEVENTF_MIDDLEUP,dwX,dwY,0,0);
			}
			else if (iMessage == 7) 
			{
				mouse_event(MOUSEEVENTF_ABSOLUTE|MOUSEEVENTF_MIDDLEDOWN,dwX,dwY,0,0);

?? 快捷鍵說(shuō)明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號(hào) Ctrl + =
減小字號(hào) Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
中文字幕免费不卡| 国产一区二区在线电影| 最近中文字幕一区二区三区| 久久麻豆一区二区| 精品国产sm最大网站| 日韩亚洲欧美成人一区| 7777精品伊人久久久大香线蕉完整版 | 精品成人一区二区三区| 欧美一区二区日韩| 日韩午夜在线播放| 欧美mv和日韩mv的网站| 精品日产卡一卡二卡麻豆| 日韩一区二区三免费高清| 91精品国产福利| 日韩精品一区二区三区视频在线观看 | 日韩亚洲国产中文字幕欧美| 51精品久久久久久久蜜臀| 欧美一区二区三区四区高清| 91精品国产综合久久精品| 欧美成人午夜电影| 26uuu色噜噜精品一区二区| 久久久亚洲精品石原莉奈| 国产日本亚洲高清| 国产精品电影一区二区| 一区二区三区在线视频观看| 午夜精品久久久久久久蜜桃app| 亚洲v中文字幕| 无码av免费一区二区三区试看| 日本vs亚洲vs韩国一区三区二区| 美腿丝袜亚洲综合| 国产一区二区电影| 99国产欧美另类久久久精品| 91福利在线免费观看| 欧美精品视频www在线观看| 91精品麻豆日日躁夜夜躁| 精品久久一二三区| 国产精品色婷婷| 一区二区三区四区激情| 热久久国产精品| 国产乱一区二区| 久久久久久久久一| 国产精品电影院| 一区二区理论电影在线观看| 日本成人在线电影网| 国产成a人亚洲精| 色综合久久中文综合久久97| 91精品国产综合久久精品麻豆| 精品国产一区二区三区久久久蜜月| 欧美激情一二三区| 亚洲一区二区成人在线观看| 免费av成人在线| 成人国产一区二区三区精品| 欧美日韩的一区二区| 久久久久97国产精华液好用吗| 亚洲欧美另类在线| 美女一区二区视频| 91首页免费视频| 欧美大度的电影原声| 亚洲色图在线播放| 捆绑变态av一区二区三区| 91免费在线播放| 精品国产污污免费网站入口 | 欧美一区日本一区韩国一区| 中文字幕不卡的av| 天堂久久久久va久久久久| 粉嫩高潮美女一区二区三区| 欧美精选一区二区| 国产精品动漫网站| 久久99精品久久久久| 在线观看免费成人| 日本一区二区三区免费乱视频| 午夜久久久影院| 99国产精品一区| 2020日本不卡一区二区视频| 亚洲午夜在线观看视频在线| 成人免费毛片app| 日韩欧美一区二区三区在线| 亚洲视频小说图片| 国产一区在线观看视频| 3d动漫精品啪啪一区二区竹菊| 亚洲欧美日韩国产成人精品影院 | 91亚洲男人天堂| 2017欧美狠狠色| 日产国产高清一区二区三区| 91福利在线免费观看| 国产精品久久久久久久午夜片| 九色综合狠狠综合久久| 欧美日韩国产一二三| 亚洲女人****多毛耸耸8| 国产91丝袜在线播放0| 欧美成人乱码一区二区三区| 五月天久久比比资源色| 在线观看网站黄不卡| 成人免费高清在线观看| 久久综合久久综合九色| 蜜臀久久99精品久久久画质超高清| 91福利精品第一导航| 国产精品久久久久三级| 国产成人精品一区二区三区网站观看 | 国产成人免费av在线| 精品处破学生在线二十三| 裸体健美xxxx欧美裸体表演| 欧美男男青年gay1069videost| 一区二区三区欧美日韩| 99久久免费视频.com| 国产精品不卡视频| 北岛玲一区二区三区四区| 中日韩av电影| eeuss鲁片一区二区三区| 欧美国产日韩精品免费观看| 成人一区二区三区视频| 日本一二三不卡| 波多野结衣中文字幕一区| 国产欧美综合在线观看第十页| 国产丶欧美丶日本不卡视频| 国产欧美久久久精品影院| 国产69精品久久久久毛片| 日本一区二区三区免费乱视频| 成人黄色软件下载| 中文字幕一区视频| 91高清视频在线| 天堂av在线一区| 欧美va在线播放| 懂色av中文一区二区三区| 中文字幕一区免费在线观看 | 欧美激情一区不卡| a在线欧美一区| 一区二区免费在线| 91精品国产综合久久精品麻豆| 久久99精品久久久久久国产越南 | 日韩视频国产视频| 国产自产v一区二区三区c| 国产伦精品一区二区三区视频青涩| 精品国产电影一区二区| 国产成人精品一区二区三区网站观看 | 欧美日韩精品一区视频| 三级一区在线视频先锋| 精品国产伦理网| 不卡大黄网站免费看| 亚洲五月六月丁香激情| 精品入口麻豆88视频| 成人免费视频网站在线观看| 一区二区久久久| 欧美一区二区三区的| 成人一区二区三区视频| 亚洲国产日韩精品| 精品免费99久久| 99久久精品费精品国产一区二区| 亚洲v中文字幕| 久久久久九九视频| 色吧成人激情小说| 秋霞av亚洲一区二区三| 国产婷婷一区二区| 欧美在线色视频| 国产精一区二区三区| 亚洲精品乱码久久久久| 日韩片之四级片| 99久久精品99国产精品| 日韩国产欧美在线播放| 欧美极品美女视频| 欧美日韩一级黄| 国产91在线观看| 日日摸夜夜添夜夜添精品视频| 精品国产一区二区精华| 色悠久久久久综合欧美99| 极品销魂美女一区二区三区| 亚洲欧洲韩国日本视频 | 一区二区三区在线播放| 日韩美女在线视频| 色域天天综合网| 国产激情91久久精品导航| 无码av免费一区二区三区试看| 国产女同互慰高潮91漫画| 在线成人av网站| 99re8在线精品视频免费播放| 久色婷婷小香蕉久久| 成人app下载| 日本成人在线视频网站| 久久国产日韩欧美精品| 亚洲成人福利片| 日韩精品在线网站| 91成人看片片| 成人美女视频在线看| 美女国产一区二区| 亚洲一区二区不卡免费| 中文字幕欧美区| 欧美va亚洲va国产综合| 欧美日韩卡一卡二| 91片在线免费观看| 国产成人a级片| 免费在线成人网| 亚洲影视在线观看| 国产精品久99| 国产亚洲精品7777| 日韩精品一区二区三区蜜臀| 欧美日本精品一区二区三区| 色视频一区二区| 97久久超碰精品国产| 高清shemale亚洲人妖| 国产中文字幕精品|