⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 iocpmodesvr.cpp

📁 本程序提供了winCE访问pc机sqlserver中间键的解决方案和源码 注:本程序以及解决方案来自网上 不是本人所写
💻 CPP
📖 第 1 页 / 共 2 页
字号:
	::LeaveCriticalSection(&cInfoSection);
    return true;
}
bool CIocpModeSvr::SendMsgToOther(SOCKET ExceptSocket,char * pData,unsigned long Length)
{
	if(ExceptSocket==INVALID_SOCKET || 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.sClient!=ExceptSocket)
			SendMsg(pPerHandleData.sClient,pData,Length);
			arrSize++;
	}
	::LeaveCriticalSection(&cInfoSection);
	return true;
}
bool CIocpModeSvr::Init(ProcessRecvData* pProcessRecvData,
						unsigned long iSvrPort,DWORD userdata)
{
	if(IsStart || pProcessRecvData==NULL)return false;

	m_SvrPort=iSvrPort;

	::InitializeCriticalSection(&cInfoSection);

	m_pProcessRecvData=pProcessRecvData;
	m_dwUserData=userdata;
	int  bRet=InitNetWork(iSvrPort,&HostIpAddr);
	if(bRet==0)
	{
		IsStart=true;
		return true;
	}
	else
		return false;
}
void CIocpModeSvr::DisConnectAll()
{
	if(!IsStart)return ;
	
	::EnterCriticalSection(&cInfoSection);
	int arrSize=0;
	PER_HANDLE_DATA pPerHandleData;
	while(arrSize<ClientInfo.GetSize())
	{
		memset(&pPerHandleData,0,sizeof(PER_HANDLE_DATA));
		pPerHandleData=ClientInfo.GetAt(arrSize);
		shutdown(pPerHandleData.sClient,1);
		closesocket(pPerHandleData.sClient);
		arrSize++;
	}
	::LeaveCriticalSection(&cInfoSection);
}
bool CIocpModeSvr::DisConnectClient(LPCTSTR ClientIp)
{
	if(!IsStart || ClientIp=="")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(ClientIp))
		{
			shutdown(pPerHandleData.sClient,1);
			closesocket(pPerHandleData.sClient);
			::LeaveCriticalSection(&cInfoSection);
			return true;
		}
		arrSize++;
	}
	::LeaveCriticalSection(&cInfoSection);
	return false;
}
bool CIocpModeSvr::DisConnectClient(SOCKET sClient)
{
	if(!IsStart || sClient==INVALID_SOCKET)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.sClient==sClient)
		{
			shutdown(pPerHandleData.sClient,1);
			closesocket(pPerHandleData.sClient);
			::LeaveCriticalSection(&cInfoSection);
			return true;
		}
		arrSize++;
	}
	::LeaveCriticalSection(&cInfoSection);
	return false;
}
void CIocpModeSvr::UnInit()
{
	if(!IsStart)return;
	//退出工作线程
	SYSTEM_INFO sys_Info;
	GetSystemInfo(&sys_Info);
	for(int i=0;i<sys_Info.dwNumberOfProcessors*2+2;i++)
	{
		//寄出退出消息
		PostQueuedCompletionStatus(CompletionPort,
								   -1,
							       -1,
							       NULL);
	}
	//退出侦听线程
	::TerminateThread(ListenThreadHandle,1L);
	::WaitForSingleObject(ListenThreadHandle,10);
	CloseHandle(ListenThreadHandle);
	//关闭网络的侦听
	shutdown(ListenSocket,0);
	closesocket(ListenSocket);
	//切断当前所有连接
	DisConnectAll();	
	::DeleteCriticalSection(&cInfoSection);
	m_pProcessRecvData=NULL;
	IsStart=false;
}
int CIocpModeSvr::InitNetWork(unsigned int SvrPort,
							  std::string *pHostIpAddress)
{
	//启动网络
	CString LogStr;
	int Error=0;
	WSADATA wsaData;
	char Name[100];
	hostent *pHostEntry;
	in_addr rAddr;
	//Net Start Up
	Error=WSAStartup(MAKEWORD(0x02,0x02),&wsaData);
	if(Error!=0)
	{
		Error = WSAGetLastError();
		pHostIpAddress->assign( "" );
		
		LogStr.Format("WSAStartUp Faild With Error: %d",Error);
		WriteLogString(LogStr);
		
		return Error;
	}
	//Make Version
	if ( LOBYTE( wsaData.wVersion ) != 2 ||
		HIBYTE( wsaData.wVersion ) != 2 )
	{
		WSACleanup( );
		
		WriteLogString("The Local Net Version Is not 2");
		
		return -1;
	}
	//Get Host Ip
	Error = gethostname ( Name, sizeof(Name) );
	if( 0 == Error )
	{
		pHostEntry = gethostbyname( Name );
		if( pHostEntry != NULL )
		{
			memcpy( &rAddr, pHostEntry->h_addr_list[0], sizeof(struct in_addr) );
			pHostIpAddress->assign( inet_ntoa( rAddr ) );
		}
		else
		{
			Error = WSAGetLastError();
			LogStr.Format("GetHostIp faild with Error: %d",Error);
			WriteLogString(LogStr);
			return Error;
			
		}
	}
	else
	{
		Error = WSAGetLastError();
		LogStr.Format("gethostname faild with Error: %d",Error);
		WriteLogString(LogStr);
		return Error;
	}
	if(0==Error)
	{
		//创建侦听端口
		ListenSocket=WSASocket(AF_INET,SOCK_STREAM,0,NULL,0,WSA_FLAG_OVERLAPPED);
		if(ListenSocket==INVALID_SOCKET)
		{
			Error = WSAGetLastError();
			LogStr.Format("CreateSocket faild with Error: %d",Error);
			WriteLogString(LogStr);
			return Error;
		}
	}
	//绑定到目标地址
	if(0==Error)
	{
		sockaddr_in InternetAddr;
		InternetAddr.sin_family=AF_INET;
		InternetAddr.sin_addr.S_un.S_addr=htonl(INADDR_ANY);
		InternetAddr.sin_port=htons(SvrPort);
		if(bind(ListenSocket,
			    (PSOCKADDR )&InternetAddr,
				sizeof(InternetAddr))==SOCKET_ERROR)
		{
			Error=GetLastError();
			LogStr.Format("bind Socket faild with Error: %d",Error);
			WriteLogString(LogStr);
			return Error;
		}
	}
	//侦听端口上的连接请求
	if(0==Error)
	{
		if(	listen(ListenSocket,5)==SOCKET_ERROR)
		{
			Error=GetLastError();
			LogStr.Format("listen Socket faild with Error: %d",Error);
			WriteLogString(LogStr);
			return Error;
		}
	}
	//创建完成端口句柄
	if(0==Error)
	{
		CompletionPort=CreateIoCompletionPort(INVALID_HANDLE_VALUE,NULL,0,0);
		if(CompletionPort==INVALID_HANDLE_VALUE)
		{
			Error=GetLastError();
			LogStr.Format("CreateIoCompletionPort faild with Error: %d",Error);
			WriteLogString(LogStr);
			return Error;
		}
	}
	//启动工作线程,线程数为CPU处理器数量*2+2
	if(0==Error)
	{	
		SYSTEM_INFO sys_Info;
		GetSystemInfo(&sys_Info);
		for(int i=0;i<sys_Info.dwNumberOfProcessors*2+2;i++)
		{
			HANDLE ThreadHandle;
			DWORD ThreadID;
			
			ThreadHandle=CreateThread(NULL,
				0,
				ServerWorkerProc,
				this,
				0,
				&ThreadID);
			if(ThreadHandle==NULL)
			{
				Error = WSAGetLastError();
				LogStr.Format("Create Server Work Thread faild with Error: %d",Error);
				WriteLogString(LogStr);
				return Error;
			}	
			CloseHandle(ThreadHandle);
		}
	}
	//启动侦听线程
	if(0==Error)
	{
		DWORD thID;
		ListenThreadHandle=CreateThread(NULL,
			                            0,
										ListenProc,
										this,
										0,
										&thID);
		if(ListenThreadHandle==NULL)
		{
			Error = WSAGetLastError();
			LogStr.Format("Create Listen Thread faild with Error: %d",Error);
			WriteLogString(LogStr);
			return Error;		
		}
	}
	return Error;
}
void CIocpModeSvr::WriteLogString(LPCTSTR strLog)
{
	SYSTEMTIME sysTm;
	::GetLocalTime(&sysTm);
	ofstream       OutputFile;
	OutputFile.open( "NetSvrLog.txt" ,ios::app);
	OutputFile<<sysTm.wYear<<"年" \
		      <<sysTm.wMonth<<"月" \
			  <<sysTm.wDay<<"日" \
			  <<sysTm.wHour<<"时" \
			  <<sysTm.wMinute<<"分" \
			  <<sysTm.wSecond<<"秒" \
			  <<":" \
			  <<"    " \
			  <<strLog \
			  <<"\n" \
			  <<endl;
	OutputFile.close();
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -