📄 iocpmodesvr.cpp
字号:
::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 + -