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

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

?? iocpmodesvr.cpp

?? 用完成端口IOCP實現的服務端引擎和多線程客戶端引擎。
?? CPP
?? 第 1 頁 / 共 2 頁
字號:
// IocpModeSvr.cpp: implementation of the CIocpModeSvr class.
//
//////////////////////////////////////////////////////////////////////

#include "stdafx.h"
#include "IocpModeSvr.h"
#include <fstream.h>


#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif

#pragma  warning(disable:4800)

DWORD WINAPI ServerWorkerProc(LPVOID lParam)
{
	CIocpModeSvr* pSvr=(CIocpModeSvr*)lParam;
	HANDLE CompletionPort=pSvr->CompletionPort;
	DWORD ByteTransferred;
	LPPER_HANDLE_DATA PerHandleData;
	PPER_IO_OPERATION_DATA PerIoData;
	DWORD RecvByte;
	while(true)
	{
		bool bSuccess=GetQueuedCompletionStatus(CompletionPort,
												&ByteTransferred,
												(LPDWORD)&PerHandleData,
												(LPOVERLAPPED* )&PerIoData,
												INFINITE);
		//退出信號到達,退出線程
		if(ByteTransferred==-1 && PerIoData==NULL)
		{
			return 1L;
		}
		//客戶機已經斷開連接或者連接出現錯誤
		if(ByteTransferred==0 && 
		   (PerIoData->OperType==RECV_POSTED || PerIoData->OperType==SEND_POSTED))
		{
			//將該客戶端數據刪除
			int arrSize=0;
			bool bFind=false;
			::EnterCriticalSection(&pSvr->cInfoSection);
			while(arrSize<pSvr->ClientInfo.GetSize())
			{
				PER_HANDLE_DATA pPerHandleData=pSvr->ClientInfo.GetAt(arrSize);
				if((pPerHandleData.IpAddr==PerHandleData->IpAddr) &&
				   (pPerHandleData.sClient==PerHandleData->sClient))
				{
					bFind=true;
					pSvr->ClientInfo.RemoveAt(arrSize);
					break;
				}
				arrSize++;
			}
			::LeaveCriticalSection(&pSvr->cInfoSection);
			if(bFind)
			{
				//記錄退出日志
				CString LogStr;
				in_addr in_A;
				in_A.S_un.S_addr=PerHandleData->IpAddr;
				LogStr.Format("Ip: %s,Socket : %d Disconneted",inet_ntoa(in_A),PerHandleData->sClient);
				pSvr->WriteLogString(LogStr);
				TRACE("\nSocket : %d Disconneted",PerHandleData->sClient);
				//調用回調函數,通知上層該客戶端已經斷開
				pSvr->m_pProcessRecvData(PerHandleData->IpAddr,
					PerHandleData->sClient,
					NULL,
					0);
				//關閉套接口
				closesocket(PerHandleData->sClient);
				GlobalFree(PerHandleData);
				GlobalFree(PerIoData);
			}
			continue;
		}
		//為讀操作完成,處理數據
		if(PerIoData->OperType==RECV_POSTED)
		{
			//調用回調函數,處理數據
			pSvr->m_pProcessRecvData(PerHandleData->IpAddr,
				                     PerHandleData->sClient,
									 PerIoData->RecvBuf,
									 ByteTransferred);
			//將源數據置空
			memset(PerIoData->RecvBuf,0,BUFFER_SIZE);
			ByteTransferred=0;
			//重置IO操作數據
			unsigned long Flag=0;
			ZeroMemory(&(PerIoData->OverLapped),sizeof(OVERLAPPED));
			
			PerIoData->RecvDataBuf.buf=PerIoData->RecvBuf;
			PerIoData->RecvDataBuf.len=BUFFER_SIZE;
			PerIoData->OperType=RECV_POSTED;
			//提交另一個Recv請求
			WSARecv(PerHandleData->sClient,
				&(PerIoData->RecvDataBuf),
				1,
				&RecvByte,
				&Flag,
				&(PerIoData->OverLapped),
				NULL);
		}
		//發送完成,置空緩沖區,釋放緩沖區
		if(PerIoData->OperType==SEND_POSTED)
		{
			memset(PerIoData,0,sizeof(PER_IO_OPERATION_DATA));
			GlobalFree(PerIoData);
			ByteTransferred=0;
		}
	}
	return 0L;
}
DWORD WINAPI ListenProc(LPVOID lParam)
{
	CIocpModeSvr* pSvr=(CIocpModeSvr*)lParam;
	SOCKET Accept;
	while(true)
	{
		//接收客戶的請求
		Accept=WSAAccept(pSvr->ListenSocket,NULL,NULL,NULL,0);
		//申請新的句柄操作數據

		LPPER_HANDLE_DATA PerHandleData=(LPPER_HANDLE_DATA) \
			                            GlobalAlloc(GPTR,
										sizeof(PER_HANDLE_DATA)
										);
		//取得客戶端信息
		sockaddr soad;
		sockaddr_in in;
		int len=sizeof(soad);
		if(getpeername(Accept,&soad,&len)==SOCKET_ERROR)
		{
			CString LogStr;
			LogStr.Format("getpeername() faild : %d",GetLastError());
			pSvr->WriteLogString(LogStr);
		}
		else{
			memcpy(&in,&soad,sizeof(sockaddr));
		}
		//句柄數據
		PerHandleData->sClient=Accept;
		PerHandleData->IpAddr=in.sin_addr.S_un.S_addr;
		//存儲客戶信息
		::EnterCriticalSection(&pSvr->cInfoSection);
		pSvr->ClientInfo.Add(*PerHandleData);
		::LeaveCriticalSection(&pSvr->cInfoSection);
		//轉儲信息
		CString LogStr;
		LogStr.Format("UserIP: %s ,Socket : %d Connected!",inet_ntoa(in.sin_addr),Accept);
		pSvr->WriteLogString(LogStr);

		TRACE("\nUserIP: %s ,Socket : %d Connected!",inet_ntoa(in.sin_addr),Accept);
		//關聯客戶端口到完成端口,句柄數據在此時被綁定到完成端口
		CreateIoCompletionPort((HANDLE)Accept,
			                   pSvr->CompletionPort,
							   (DWORD)PerHandleData,
							   0);
		//Io操作數據標志

		PPER_IO_OPERATION_DATA PerIoData=(PPER_IO_OPERATION_DATA) \
			                              GlobalAlloc(GPTR,
										  sizeof(PER_IO_OPERATION_DATA));
		unsigned long  Flag=0;
		DWORD RecvByte;
		ZeroMemory(&(PerIoData->OverLapped),sizeof(OVERLAPPED));

		PerIoData->RecvDataBuf.buf=PerIoData->RecvBuf;
		PerIoData->RecvDataBuf.len=BUFFER_SIZE;
		PerIoData->OperType=RECV_POSTED;
		//提交首個接收數據請求
		//這時
		//如果客戶端斷開連接
		//則也可以以接收數據時得到通知	
		WSARecv(PerHandleData->sClient,
			&(PerIoData->RecvDataBuf),
			1,
			&RecvByte,
			&Flag,
			&(PerIoData->OverLapped),
			NULL);
	}
}
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
CIocpModeSvr::CIocpModeSvr()
{
	IsStart=false;
}
CIocpModeSvr::~CIocpModeSvr()
{
}
bool CIocpModeSvr::SendMsg(LPCTSTR TargetIp,char * pData,unsigned long Length)
{
	if(TargetIp=="" || pData==NULL || Length==0 || !IsStart)
		return false;

	bool bFind=false;
	PER_HANDLE_DATA pPerHandleData;
	memset(&pPerHandleData,0,sizeof(PER_HANDLE_DATA));

	unsigned long tIp=inet_addr(TargetIp);
	//在表中查找該客戶端數據并發送數據
	
	::EnterCriticalSection(&cInfoSection);
	int arrSize=0;
	while(arrSize<ClientInfo.GetSize())
	{
		pPerHandleData=ClientInfo.GetAt(arrSize);
		if((pPerHandleData.IpAddr==tIp))
		{
			bFind=true;
			break;
		}
		arrSize++;
	}
	::LeaveCriticalSection(&cInfoSection);
	//找到該客戶端,可以提交發送數據請求了
	if(bFind)
	{
		return SendMsg(pPerHandleData.sClient,pData,Length);
	}
	else
	{
		CString LogStr;
		pData[Length]='\0';
		LogStr.Format("試圖發送數據到沒有連接的客戶端:%s數據:%s",TargetIp,pData);
		WriteLogString(LogStr);
		return false;
	}
	return false;
}
//提交發送消息請求,
//如果提交發送消息失敗,
//則將導致在工作線程里將目標客戶端的連接切斷
bool CIocpModeSvr::SendMsg(SOCKET sClient,char * pData,unsigned long Length)
{
	if(sClient==INVALID_SOCKET || pData==NULL || Length==0 || !IsStart)return false;

	//申請操作鍵
	PPER_IO_OPERATION_DATA PerIoData=(PPER_IO_OPERATION_DATA) \
									  GlobalAlloc(GPTR,
		                              sizeof(PER_IO_OPERATION_DATA));

	//準備緩沖
	unsigned long  Flag=0;
	DWORD SendByte;
	ZeroMemory(&(PerIoData->OverLapped),sizeof(OVERLAPPED));
	memcpy(PerIoData->SendBuf,pData,Length);
	PerIoData->SendDataBuf.buf=PerIoData->SendBuf;
	PerIoData->SendDataBuf.len=Length;
	PerIoData->OperType=SEND_POSTED;
	int bRet=WSASend(sClient,
		             &(PerIoData->SendDataBuf),
		             1,
		             &SendByte,
		             Flag,
		             &(PerIoData->OverLapped),
		             NULL);
	if(bRet==SOCKET_ERROR && GetLastError()!=WSA_IO_PENDING)
	{
		CString LogStr;
		LogStr.Format("WSASend With Error : %d",GetLastError());
		WriteLogString(LogStr);
		return false;
	}
	else return true;
	
	return false;
}
bool CIocpModeSvr::SendMsgToAll(char * pData,unsigned long Length)
{
	if(pData==NULL || Length==0 || !IsStart)return false;

	::EnterCriticalSection(&cInfoSection);
	int arrSize=0;
	PER_HANDLE_DATA pPerHandleData;
	while(arrSize<ClientInfo.GetSize())
	{
		memset(&pPerHandleData,0,sizeof(PER_HANDLE_DATA));
		pPerHandleData=ClientInfo.GetAt(arrSize);
		SendMsg(pPerHandleData.sClient,pData,Length);
		arrSize++;
	}
	::LeaveCriticalSection(&cInfoSection);
	return true;
}
bool CIocpModeSvr::SendMsgToOther(LPCTSTR ExceptIp,char *pData,unsigned long Length)
{
	if(ExceptIp=="" || pData==NULL || Length==0 || !IsStart)return false;

	::EnterCriticalSection(&cInfoSection);
	int arrSize=0;
	PER_HANDLE_DATA pPerHandleData;
	while(arrSize<ClientInfo.GetSize())
	{
		memset(&pPerHandleData,0,sizeof(PER_HANDLE_DATA));
		pPerHandleData=ClientInfo.GetAt(arrSize);
		if(pPerHandleData.IpAddr!=inet_addr(ExceptIp))
			SendMsg(pPerHandleData.sClient,pData,Length);
		arrSize++;
	}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
日韩欧美国产一区二区在线播放| 亚洲美女在线一区| 国产精品超碰97尤物18| 天天操天天综合网| www.av精品| 国产色婷婷亚洲99精品小说| 天天色综合成人网| 91激情在线视频| 国产精品电影一区二区三区| 精品一区二区三区在线观看| 欧美在线不卡视频| 中文字幕日本不卡| 国产成人鲁色资源国产91色综| 欧美一区二区福利在线| 玉足女爽爽91| 97精品国产97久久久久久久久久久久 | 欧美大片在线观看| 亚洲综合自拍偷拍| 91麻豆精品秘密| 国产精品高清亚洲| 成人午夜在线视频| 欧美国产国产综合| 国产美女精品在线| 久久久精品欧美丰满| 麻豆91免费看| 日韩欧美三级在线| 蜜臀精品久久久久久蜜臀| 91精品国产高清一区二区三区| 亚洲国产成人精品视频| 欧美无乱码久久久免费午夜一区| 亚洲色欲色欲www| 91蜜桃免费观看视频| 一区二区三区在线免费播放| 91一区二区在线观看| 亚洲精品少妇30p| 91久久免费观看| 亚洲国产精品人人做人人爽| 欧美又粗又大又爽| 午夜a成v人精品| 日韩欧美的一区二区| 秋霞av亚洲一区二区三| 精品国产伦一区二区三区免费| 看电影不卡的网站| 一区二区三区鲁丝不卡| 欧美另类变人与禽xxxxx| 日本成人在线视频网站| 26uuu国产电影一区二区| 国产一区在线观看视频| 国产亚洲一二三区| 色噜噜狠狠成人网p站| 亚洲成人av免费| 日韩亚洲电影在线| 成人免费精品视频| 亚洲一区二区三区精品在线| 欧美一级二级三级蜜桃| 国产精品一区在线| 亚洲精品美腿丝袜| 日韩免费观看高清完整版| 国产精品88888| 一区二区久久久久久| 欧美电影免费观看高清完整版在| 国产91精品在线观看| 亚洲欧美成人一区二区三区| 91精品国产综合久久精品麻豆| 蜜桃视频一区二区三区| 中文字幕中文字幕一区二区 | 亚洲欧洲日本在线| 欧美日韩午夜影院| 国产激情视频一区二区在线观看| 亚洲激情自拍偷拍| 欧美精品一区二区三区很污很色的| 成av人片一区二区| 美国三级日本三级久久99| 亚洲视频在线一区观看| 精品免费视频.| 91国偷自产一区二区开放时间 | 久久疯狂做爰流白浆xx| 久久久久久久综合日本| 欧美午夜精品理论片a级按摩| 久久黄色级2电影| 亚洲激情一二三区| 日本一区二区三区久久久久久久久不| 欧日韩精品视频| 成人午夜激情视频| 久久丁香综合五月国产三级网站| 亚洲黄色尤物视频| 国产精品毛片a∨一区二区三区| 91精品午夜视频| 色综合一区二区| 国产成人精品亚洲日本在线桃色| 亚洲线精品一区二区三区八戒| 欧美韩日一区二区三区| 日韩三级在线观看| 欧美日韩国产精品成人| 91影视在线播放| av在线播放不卡| 国产精品456| 国产在线精品一区二区| 日本不卡一区二区三区高清视频| 亚洲自拍另类综合| 亚洲精品一二三| 国产精品久久久久久久午夜片| 久久综合成人精品亚洲另类欧美| 日韩西西人体444www| 欧美电影影音先锋| 欧美日韩免费视频| 欧美三级一区二区| 欧美色区777第一页| 日本道精品一区二区三区 | 在线亚洲一区观看| 99久精品国产| 精品理论电影在线| 欧美xxx久久| 精品成a人在线观看| 337p日本欧洲亚洲大胆精品| 精品久久99ma| 亚洲精品在线网站| 国产欧美一区二区三区鸳鸯浴 | 亚洲欧美日韩国产成人精品影院| 国产精品视频观看| 日韩毛片一二三区| 一区二区三区.www| 亚洲成人精品影院| 蜜臀久久99精品久久久久久9| 免费成人你懂的| 国产乱码精品一区二区三区五月婷| 极品少妇xxxx精品少妇| 国产高清精品在线| 91小视频在线观看| 91久久人澡人人添人人爽欧美| 欧美日韩中文字幕精品| 7777精品伊人久久久大香线蕉的 | 制服丝袜国产精品| 精品免费日韩av| 国产欧美一区二区精品性色超碰| 国产精品欧美一区喷水| 国产精品丝袜黑色高跟| 一区二区三国产精华液| 五月激情综合网| 国产精品亚洲专一区二区三区| 成人av动漫在线| 中文字幕一区二| 一区二区三区四区高清精品免费观看| 亚洲成人av资源| 国模一区二区三区白浆| 91在线porny国产在线看| 在线综合+亚洲+欧美中文字幕| 久久精品一区二区三区不卡| 亚洲黄色尤物视频| 狠狠狠色丁香婷婷综合久久五月| 99久久综合狠狠综合久久| 欧美日韩一区二区三区在线看| 久久午夜羞羞影院免费观看| 亚洲欧美日本韩国| 九九九精品视频| 91国产视频在线观看| 亚洲精品一区二区精华| 亚洲精品日韩综合观看成人91| 激情综合网最新| 欧洲亚洲精品在线| 国产欧美日韩另类视频免费观看 | 狠狠色丁香婷婷综合| 色综合中文字幕| 久久久久久久久久美女| 亚洲sss视频在线视频| 成人动漫一区二区| 日韩精品一区二区三区老鸭窝| 亚洲日本护士毛茸茸| 久久99精品国产91久久来源| 色老综合老女人久久久| 国产欧美综合在线观看第十页 | 亚洲毛片av在线| 国产一区二区女| 欧美乱妇一区二区三区不卡视频| 国产精品视频你懂的| 久久国产麻豆精品| 欧美色图天堂网| 亚洲人成网站精品片在线观看| 精品一区二区在线视频| 69p69国产精品| 亚洲愉拍自拍另类高清精品| 成人黄色综合网站| 久久久久久亚洲综合| 久久成人免费电影| 欧美一二三在线| 视频在线在亚洲| 欧美影视一区在线| 亚洲在线免费播放| 在线观看网站黄不卡| 亚洲黄色av一区| 色呦呦日韩精品| 亚洲激情自拍视频| 色爱区综合激月婷婷| 亚洲色图在线播放| 91视频免费看| 亚洲美女屁股眼交3| av高清不卡在线| 欧美伊人精品成人久久综合97| 国产精品免费丝袜| 欧美videos中文字幕|