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

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? server.c

?? 網絡編程實例
?? C
?? 第 1 頁 / 共 3 頁
字號:

	// 建立屏幕的高度
	memset(szMessage,'\0',sizeof(szMessage));
	sprintf(szMessage,"%d",iHeight);
	iSent = Transmit(MySocket,szMessage,strlen(szMessage));

	// 接收確認
	memset(szMessage,'\0',sizeof(szMessage));
	iRecv = recv(MySocket,szMessage,81,0);
	szMessage[iRecv] = '\0';
}

// 通過socket發送區域顯示位圖
int SendRegionDisplay(HWND hWnd,SOCKET MySocket)
{
	char	szMessage[81];
	DWORD	iSent,iRecv;
	int		fSend = FALSE;
	int		iUpdates;
	WORD	wTreeSize;
	DWORD	dwByteTree[768];
	DWORD	dwCodes[514];
	DWORD	dwCompLen,dwLastCompLen;
	BOOL	fTransmit;
	char	*pTempDIB;
	DWORD	dwMinCompress;

	// 指向GDI鏈表的起始位
	iUpdates = 0;
	pGdiNode = GdiStart.pNext;
	while (pGdiNode)
	{
		//為每個網格得到區域顯示
		fSend = GetRegionDisplay(hWnd);
		// 計算需要發送的變化的顯示區域的數目
		if (fSend)
			iUpdates++;
		// 移動到下一個節點
		pGdiNode = pGdiNode->pNext;
	}

	// 發送到客戶端需要更新的顯示區域的數目
	memset(szMessage,'\0',sizeof(szMessage));
	sprintf(szMessage,"%d",iUpdates);
	iSent = Transmit(MySocket,szMessage,strlen(szMessage));
	// 接收確認
	memset(szMessage,'\0',sizeof(szMessage));
	iRecv = recv(MySocket,szMessage,81,0);
	szMessage[iRecv] = '\0';

	if (iUpdates > 0)
	{
		// 指向GDI鏈表的起始位
		pGdiNode = GdiStart.pNext;
		while (pGdiNode)
		{
			// 如果桌面發生了變化,則發送DIB
			if (pGdiNode->Gdi.fChange)
			{
				int		iCompressions = 1;
				//無壓縮
				if (iCompressionLevel == 0) 
				{
					pGdiNode->Gdi.pDIBCompress = (char *)malloc(pGdiNode->Gdi.dwCompress);
					memblast(pGdiNode->Gdi.pDIBCompress,pGdiNode->Gdi.pDIBChange,pGdiNode->Gdi.dwCompress);
					dwSendLen = pGdiNode->Gdi.dwCompress;
				}
				if (iCompressionLevel == 10) // 單遍霍夫曼編碼壓縮
				{
					pGdiNode->Gdi.pDIBCompress = (char *)malloc(pGdiNode->Gdi.dwCompress + 1536);
					// 生成霍夫曼字節樹字典
					wTreeSize = HuffmanDictionary(pGdiNode->Gdi.pDIBChange,pGdiNode->Gdi.dwCompress,&dwByteTree[0],&dwCodes[0]);
					// 使用霍夫曼壓縮方法壓縮圖片
					dwSendLen = HuffmanCompress(pGdiNode->Gdi.pDIBChange,pGdiNode->Gdi.dwCompress,wTreeSize,&dwByteTree[0],&dwCodes[0],pGdiNode->Gdi.pDIBCompress);
				}
				else if (iCompressionLevel == 11) // 多遍霍夫曼壓縮編碼
				{
					dwMinCompress = pGdiNode->Gdi.dwCompress + 1536;
					pGdiNode->Gdi.pDIBCompress = (char *)malloc(dwMinCompress);
					pTempDIB = (char *)malloc(pGdiNode->Gdi.dwCompress);
					memblast(pTempDIB,pGdiNode->Gdi.pDIBChange,pGdiNode->Gdi.dwCompress);
					iCompressions = 0;
					dwCompLen = pGdiNode->Gdi.dwCompress;
					dwLastCompLen = dwCompLen;
					for (;;)
					{
						// 生成霍夫曼字節樹字典
						wTreeSize = HuffmanDictionary(pTempDIB,pGdiNode->Gdi.dwCompress,&dwByteTree[0],&dwCodes[0]);
						// 計算壓縮長度
						dwCompLen = HuffmanCountCompress(pTempDIB,dwCompLen,wTreeSize,&dwCodes[0]);
						if (dwCompLen < dwMinCompress)
						{
							dwSendLen = HuffmanCompress(pTempDIB,dwLastCompLen,wTreeSize,&dwByteTree[0],&dwCodes[0],pGdiNode->Gdi.pDIBCompress);
							memblast(pTempDIB,pGdiNode->Gdi.pDIBCompress,dwSendLen);
							dwMinCompress = dwSendLen;
							dwLastCompLen = dwCompLen;
							iCompressions++;
						}
						else
							break;
					}
					free(pTempDIB);
				}
				else if (iCompressionLevel == 12) // Run Length編碼
				{
					//為最壞的情況分配壓縮空間
					pGdiNode->Gdi.pDIBCompress = (char *)malloc(pGdiNode->Gdi.dwCompress * 3 + 4);
					// Run Length編碼圖象
					dwSendLen = RunLengthEncode(pGdiNode->Gdi.pDIBChange,pGdiNode->Gdi.dwCompress,pGdiNode->Gdi.pDIBCompress);
				}
				else if (iCompressionLevel == 13) // Run Length&Huffman編碼
				{
					pTempDIB = (char *)malloc(pGdiNode->Gdi.dwCompress * 3 + 4);
					pGdiNode->Gdi.pDIBCompress = (char *)malloc(pGdiNode->Gdi.dwCompress * 3 + 4);
					// Run Length 編碼圖象
					dwCompLen = RunLengthEncode(pGdiNode->Gdi.pDIBChange,pGdiNode->Gdi.dwCompress,pTempDIB);
					// 生成霍夫曼字節樹的字典
					wTreeSize = HuffmanDictionary(pTempDIB,dwCompLen,&dwByteTree[0],&dwCodes[0]);
					// 使用霍夫曼壓縮Run Lenght編碼的圖象
					dwSendLen = HuffmanCompress(pTempDIB,dwCompLen,wTreeSize,&dwByteTree[0],&dwCodes[0],pGdiNode->Gdi.pDIBCompress);
					// 釋放臨時的DIB
					free(pTempDIB);
				}

				// 建立位圖控制消息
				memset(szMessage,'\0',sizeof(szMessage));
				sprintf(szMessage,"%d;%d;%d;%ld;%ld;%ld;",
					iCompressions,
					pGdiNode->Gdi.iGridX,pGdiNode->Gdi.iGridY,
					pGdiNode->Gdi.iStartPos,
					pGdiNode->Gdi.dwCompress,dwSendLen);
				// 發送控制消息
				iSent = Transmit(MySocket,szMessage,strlen(szMessage));

				// 接收確認
				memset(szMessage,'\0',sizeof(szMessage));
				iRecv = recv(MySocket,szMessage,81,0);
				szMessage[iRecv] = '\0';

				// 發送壓縮的DIB
				fTransmit = Transmit(MySocket,pGdiNode->Gdi.pDIBCompress,dwSendLen);
				// 釋放壓縮的DIB
				free(pGdiNode->Gdi.pDIBCompress);
				// 接收確認
				memset(szMessage,'\0',sizeof(szMessage));
				iRecv = recv(MySocket,szMessage,81,0);
				szMessage[iRecv] = '\0';
			}
			pGdiNode = pGdiNode->pNext;
		}
	}
	return iUpdates;
}

//傳輸數據到客戶端
BOOL Transmit(SOCKET MySocket,char *pData,DWORD dwLength)
{
	WSAOVERLAPPED	olSend;
	WSAEVENT	gheventOlSock;
	WSAEVENT	eventArray[2];
	WSABUF		buffSend;
	DWORD		dwRet,dwNumBytes,dwFlags;
	int			nWSAError;
	char		szError[81];

	// 為發送完成創建一個信號事件
	gheventOlSock = WSACreateEvent();
	eventArray[0] = gheventOlSock;

	// 初始化重疊發送的結構
	ZeroMemory(&olSend, sizeof(WSAOVERLAPPED));
	// 為發送重疊結構創建一個信號時間
	olSend.hEvent= gheventOlSock;
	buffSend.len = dwLength;
	buffSend.buf = pData;
	// 持續發送,直到dwSendLen個字節被發送完成
	while (TRUE)
	{
		if ((dwRet = WSASend(MySocket,&buffSend,1,&dwNumBytes,0,&olSend,NULL)) == SOCKET_ERROR)
		{
			nWSAError= WSAGetLastError();
			if (nWSAError != ERROR_IO_PENDING)
			{
				sprintf(szError,"WSASend failed with error %d\n",nWSAError);
				MessageBox(NULL,szError,"Server",MB_OK);
			}
		}
	
		if (WSAWaitForMultipleEvents(1,eventArray,FALSE,WSA_INFINITE,FALSE) == WSA_WAIT_FAILED)
		{
			sprintf(szError,"WSAWaitForMultipleEvents failed %d\n", WSAGetLastError());
			MessageBox(NULL,szError,"Server",MB_OK);
		} 
		// 重置gheventOlSock
		WSAResetEvent(eventArray[0]);
		if (WSAGetOverlappedResult(MySocket,&olSend,&dwNumBytes,FALSE,&dwFlags) == FALSE)
		{
			sprintf(szError,"WSAGetOverlappedResult failed with error %d\n", WSAGetLastError());
			MessageBox(NULL,szError,"Server",MB_OK);
		}
		buffSend.len -= dwNumBytes;
		if (buffSend.len == 0) 
			break;
		else 
			buffSend.buf += dwNumBytes;
	}

	// 關閉信號事件
	WSACloseEvent(gheventOlSock);
	return TRUE;
}

//返回本機安裝的所有的有XP1_GUARANTEED_DELIVERY and XP1_GUARANTEED_ORDER標志的協議和協議鏈
int SelectProtocols(DWORD dwSetFlags,DWORD dwNotSetFlags,LPWSAPROTOCOL_INFO lpProtocolBuffer,LPDWORD lpdwBufferLength,WSAPROTOCOL_INFO *pProtocol)
{
	LPBYTE				pBuf;
	LPWSAPROTOCOL_INFO	pInfo;
	DWORD				dwNeededLen;
	LPWSAPROTOCOL_INFO	pRetInfo;
	DWORD				dwRetLen;
	int					nCount;
	int					nMatchCount;
	int					nRet;

	// 決定需要的緩沖區大小
	dwNeededLen = 0;
	nRet = WSAEnumProtocols(NULL, NULL, &dwNeededLen);
	if (nRet == SOCKET_ERROR)
	{
		if (WSAGetLastError() != WSAENOBUFS)
			return SOCKET_ERROR;
	}
	// 分配大小
	pBuf = malloc(dwNeededLen);
	if (pBuf == NULL)
	{
		WSASetLastError(WSAENOBUFS);
		return SOCKET_ERROR;
	}

	nRet = WSAEnumProtocols(NULL,(LPWSAPROTOCOL_INFO)pBuf,&dwNeededLen);
	if (nRet == SOCKET_ERROR)
	{
		free(pBuf);
		return SOCKET_ERROR;
	}

	#define REJECTSET(f) \
	    ((dwSetFlags & f) && !(pInfo->dwServiceFlags1 & f))
	#define REJECTNOTSET(f) \
	    ((dwNotSetFlags &f) && (pInfo->dwServiceFlags1 & f))
	#define REJECTEDBY(f) (REJECTSET(f) || REJECTNOTSET(f))

	pInfo = (LPWSAPROTOCOL_INFO)pBuf;	
	pRetInfo = lpProtocolBuffer;
	dwRetLen = 0;
	nMatchCount = 0;
	for(nCount = 0; nCount < nRet; nCount++)
	{
		while(1)
		{
			if (REJECTEDBY(XP1_CONNECTIONLESS))
				break;
			if (REJECTEDBY(XP1_GUARANTEED_DELIVERY))
				break;
			if (REJECTEDBY(XP1_GUARANTEED_ORDER))
				break;
			if (REJECTEDBY(XP1_MESSAGE_ORIENTED))
				break;
			if (REJECTEDBY(XP1_PSEUDO_STREAM))
				break;
			if (REJECTEDBY(XP1_GRACEFUL_CLOSE))
				break;
			if (REJECTEDBY(XP1_EXPEDITED_DATA))
				break;
			if (REJECTEDBY(XP1_CONNECT_DATA))
				break;
			if (REJECTEDBY(XP1_DISCONNECT_DATA))
				break;
			if (REJECTEDBY(XP1_SUPPORT_BROADCAST)) 
				break;
			if (REJECTEDBY(XP1_SUPPORT_MULTIPOINT))
				break;
			if (REJECTEDBY(XP1_MULTIPOINT_DATA_PLANE))
				break;
			if (REJECTEDBY(XP1_QOS_SUPPORTED))
				break;
			if (REJECTEDBY(XP1_UNI_SEND))
				break;
			if (REJECTEDBY(XP1_UNI_RECV))
				break;
			if (REJECTEDBY(XP1_IFS_HANDLES))
				break;
			if (REJECTEDBY(XP1_PARTIAL_MESSAGE))
				break;

			dwRetLen += sizeof(WSAPROTOCOL_INFO);

			if (dwRetLen > *lpdwBufferLength)
			{
				WSASetLastError(WSAENOBUFS);
				*lpdwBufferLength = dwNeededLen;
				free(pBuf);
				return SOCKET_ERROR;
			}
			nMatchCount++;
			// 拷貝協議到調用者的buffer里
			memblast(pRetInfo,pInfo,sizeof(WSAPROTOCOL_INFO));
			if (strcmp(pInfo->szProtocol,"MSAFD Tcpip [TCP/IP]") == 0)
				memblast(pProtocol,pInfo,sizeof(WSAPROTOCOL_INFO));
			pRetInfo++;
			break;
		}
		pInfo++;
	}
	free(pBuf);
	*lpdwBufferLength = dwRetLen;
	return(nMatchCount);
}

void memblast(void* dest,void* src,DWORD count)
{
	DWORD	iCount;

	__asm
	{
		MOV		ECX,count
		SHR		ECX,2
		SHL		ECX,2
		MOV		iCount,ECX

		MOV		ESI,src
		MOV		EDI,dest
		MOV		ECX,iCount
		SHR		ECX,2	
		REP		MOVSD	

		MOV		ECX,count
		MOV		EAX,iCount
		SUB		ECX,EAX

		JZ		Exit

		MOV		ESI,src	
		ADD		ESI,EAX	
		MOV		EDI,dest	
		ADD		EDI,EAX		
		REP		MOVSB		
		Exit:
	}
}
/*
int GetLocalHostName(char* sHostName)	//獲得本地計算機名稱
{
	char szHostName[256];
	int nRetCode;
	nRetCode=gethostname(szHostName,sizeof(szHostName));
	if(nRetCode!=0)
	{
		//產生錯誤
		strcpy(sHostName,"沒有取得");
		return GetLastError();
	}
	strcpy(sHostName,szHostName);
	return 0;
}
int GetIpAddress(char *sHostName, BYTE *f0,BYTE *f1,BYTE *f2,BYTE *f3)//獲得本地IP
{
	struct hostent FAR * lpHostEnt=gethostbyname(sHostName);
	if(lpHostEnt==NULL)
	{
		//產生錯誤
		f0=f1=f2=f3=0;
		return GetLastError();
	}
	//獲取IP
	if(lpHostEnt->h_addr_list[0])
	{
		struct in_addr inAddr;
		memmove(&inAddr,lpHostEnt->h_addr_list[0],4);
		*f0=inAddr.S_un.S_un_b.s_b1;
		*f1=inAddr.S_un.S_un_b.s_b2;
		*f2=inAddr.S_un.S_un_b.s_b3;
		*f3=inAddr.S_un.S_un_b.s_b4;
	}
	return 0;
}
*/

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
26uuu精品一区二区三区四区在线| 一区二区三区四区亚洲| 欧美一级在线免费| 欧美精品久久一区| 欧美日韩日本视频| 欧美影片第一页| 欧美熟乱第一页| 51久久夜色精品国产麻豆| 欧美区在线观看| 日韩网站在线看片你懂的| 日韩欧美成人激情| 2023国产精华国产精品| 久久久噜噜噜久久中文字幕色伊伊| 精品美女在线播放| 国产欧美中文在线| 中文字幕在线观看不卡| 亚洲日本在线a| 亚洲成人综合网站| 免费的成人av| 国模冰冰炮一区二区| 丰满岳乱妇一区二区三区| 成人av影视在线观看| 91色九色蝌蚪| 欧美日韩国产片| 精品国产乱子伦一区| 中文字幕av资源一区| 一区二区三区精品| 麻豆成人免费电影| 成人免费黄色大片| 欧美午夜精品一区二区三区| 日韩一区二区在线看片| 久久九九全国免费| 亚洲欧美日韩国产成人精品影院 | 最近日韩中文字幕| 一区二区三区精品| 国内外成人在线视频| 99久久精品一区二区| 欧美美女一区二区在线观看| 欧美刺激脚交jootjob| 国产精品少妇自拍| 亚洲国产乱码最新视频| 国内精品免费在线观看| 91成人免费在线| 欧美电影免费观看高清完整版在| 国产精品久久久久久久久免费相片 | 国产精品亚洲视频| 色久综合一二码| 精品久久五月天| 一区二区在线看| 国内精品视频666| 欧美午夜一区二区三区 | 国产麻豆欧美日韩一区| 99re成人在线| 日韩欧美中文字幕精品| 中文字幕日韩一区二区| 蜜桃精品视频在线观看| 99视频在线观看一区三区| 欧美大胆人体bbbb| 一区二区三区四区蜜桃| 国产一区二区在线观看视频| 欧美私人免费视频| 国产精品女人毛片| 麻豆91免费看| 欧美亚洲高清一区二区三区不卡| 久久久精品免费网站| 日韩精品视频网| 91麻豆精品视频| 久久久国产午夜精品| 日韩av电影免费观看高清完整版 | 日韩视频免费观看高清完整版在线观看 | 亚洲欧洲av在线| 国产最新精品精品你懂的| 欧美日韩成人激情| 亚洲美女免费在线| 处破女av一区二区| 精品国产乱码久久久久久久| 香蕉久久一区二区不卡无毒影院 | 欧美在线观看视频在线| 国产女人aaa级久久久级| 麻豆成人免费电影| 在线成人高清不卡| 亚洲一区二区在线免费看| 高清视频一区二区| 2021国产精品久久精品| 久久99久久99| 日韩一区二区精品在线观看| 亚洲成人第一页| 欧美中文字幕一区| 一区二区三区在线免费播放| 波多野结衣精品在线| 欧美激情综合网| 国产成人精品一区二区三区四区 | 18欧美乱大交hd1984| 风流少妇一区二区| 中文字幕国产一区| 国产成人在线看| 欧美激情在线免费观看| 国产成人精品1024| 国产亲近乱来精品视频| 成人禁用看黄a在线| 日本一区二区三区电影| 丁香六月久久综合狠狠色| 国产调教视频一区| 成人激情黄色小说| 中文字幕在线不卡国产视频| 91麻豆免费观看| 亚洲一区二区三区小说| 欧美午夜精品一区二区蜜桃| 午夜电影网一区| 91精品国产综合久久久久久| 日韩av中文字幕一区二区三区 | 天堂影院一区二区| 91麻豆精品国产91久久久更新时间| 亚洲国产综合视频在线观看| 在线观看日韩电影| 亚洲bt欧美bt精品| 日韩精品在线看片z| 国内精品久久久久影院薰衣草| 国产精品欧美久久久久一区二区| 国产成人精品亚洲日本在线桃色| 中文av一区二区| 成人av网站免费| 一区二区三区美女| 欧美久久久久久久久| 另类的小说在线视频另类成人小视频在线 | 欧美一区二区三区小说| 韩国成人精品a∨在线观看| 久久久不卡影院| 91在线视频网址| 亚洲国产成人av| 日韩精品专区在线影院重磅| 国产suv精品一区二区883| 亚洲欧美自拍偷拍色图| 欧美午夜在线一二页| 紧缚奴在线一区二区三区| 国产日韩欧美一区二区三区乱码| 国产成人久久精品77777最新版本| 亚洲人成网站在线| 欧美精品第1页| 国产乱子轮精品视频| 最新国产精品久久精品| 欧美日韩国产高清一区二区三区| 九色综合狠狠综合久久| 国产精品护士白丝一区av| 欧美日韩一区在线| 国产原创一区二区| 中文字幕在线观看一区| 制服丝袜亚洲播放| 不卡的看片网站| 午夜日韩在线观看| 国产欧美一区二区精品久导航| 91亚洲精华国产精华精华液| 日本欧美加勒比视频| 国产精品久久777777| 欧美一区二区三区在线看| av在线综合网| 美女视频免费一区| 亚洲三级久久久| 久久亚区不卡日本| 欧美三级日韩在线| 成人免费看片app下载| 麻豆精品一区二区三区| 亚洲美女视频在线观看| 久久免费电影网| 欧美日韩在线精品一区二区三区激情| 精品亚洲porn| 亚洲电影一级黄| 国产精品国产三级国产普通话99| 91麻豆精品91久久久久久清纯| 97精品视频在线观看自产线路二| 美女www一区二区| 亚洲综合在线视频| 国产精品私人影院| 精品国产区一区| 欧美日精品一区视频| 成a人片亚洲日本久久| 久久成人精品无人区| 视频精品一区二区| 曰韩精品一区二区| 在线精品国精品国产尤物884a| 自拍偷自拍亚洲精品播放| 欧美精品 日韩| 久久9热精品视频| 亚洲成人精品一区| 亚洲精品福利视频网站| 中文一区在线播放| 久久亚洲一区二区三区四区| 欧美一区二区三区在线观看视频| 91成人在线精品| 色婷婷综合久久久中文一区二区| 成人午夜电影久久影院| 国产一区二区三区香蕉 | 91农村精品一区二区在线| 国产精品一级二级三级| 麻豆freexxxx性91精品| 日本亚洲电影天堂| 亚州成人在线电影| 亚洲一区二区三区四区在线 | 欧美中文一区二区三区| 色狠狠色噜噜噜综合网|