📄 iocmplt.cpp
字号:
{strcpy(gameInfo->ClientName,PerIoData->gameinfo.Name);
gameInfo->hClient=PerHandleData->Socket;
printf("one join game:%s player1:%s player2:%s\n",gameInfo->GameName,gameInfo->HostName,gameInfo->ClientName);
sprintf(log,"one join game:%s player1:%s player2:%s\r\n",gameInfo->GameName,gameInfo->HostName,gameInfo->ClientName);
AddLog(log,strlen(log));
SendToClient(PerHandleData->Socket,&(char&)joininfo,sizeof(JoinInfo),SERVER_SUCCESS,PerIoData);
break;}
}
if(gameInfo->hClient==0)//没有此游戏存在
{printf("join error have no such game!\n");
sprintf(log,"join error have no such game!\r\n");
AddLog(log,strlen(log));
SendToClient(PerHandleData->Socket,&(char&)joininfo,sizeof(JoinInfo),SERVER_FAIL,PerIoData);}
}
}
break;
case GAME_STATE_START://开始消息
{
StartInfo startinfo;
//查找所属游戏
LPGameInfo gameInfo =NULL;
GameInfo_POS pos;
gameInfo_group.GetHeadPosition( pos );
while( pos != NULL )
{
gameInfo = gameInfo_group.GetNext( pos );
if(PerIoData->gameinfo.Room==gameInfo->Room&&PerIoData->gameinfo.Desk==gameInfo->Desk)
break;
}
if(PerHandleData->Socket==gameInfo->hHost&&gameInfo->hClient!=0)
{
strcpy(startinfo.GameName,gameInfo->GameName);
startinfo.player=1;
startinfo.numplayers=2;
//查client端的结构
LPPER_IO_OPERATION_DATA lp_io=NULL;IO_POS pos;
m_io_group.GetHeadPosition( pos );
while( pos != NULL )
{lp_io = m_io_group.GetNext( pos );
if(lp_io->gameinfo.Sock==gameInfo->hClient) break;
}
ZeroMemory(&(lp_io->Overlapped), sizeof(OVERLAPPED));
printf("Game %s Start!\n",gameInfo->GameName);
sprintf(log,"Game %s Start!\r\n",gameInfo->GameName);
AddLog(log,strlen(log));
//发开始消息
SendToClient(PerHandleData->Socket,&(char&)startinfo,sizeof(StartInfo),SERVER_SUCCESS,PerIoData);
startinfo.player=2;
SendToClient(gameInfo->hClient,&(char&)startinfo,sizeof(StartInfo),SERVER_SUCCESS,lp_io);
}
else
SendToClient(PerHandleData->Socket,&(char&)startinfo,sizeof(StartInfo),SERVER_FAIL,PerIoData);
}
break;
case GAME_STATE_MSG://收到游戏中信息
{
MsgInfo msginfo;
ZeroMemory(&msginfo, sizeof(MsgInfo));
memcpy(&msginfo,&package.Buffer,package.Size);
//查找所属游戏
LPGameInfo gameInfo =NULL;
GameInfo_POS pos;
gameInfo_group.GetHeadPosition( pos );
while( pos != NULL )
{
gameInfo = gameInfo_group.GetNext( pos );
if(PerIoData->gameinfo.Room==gameInfo->Room&&PerIoData->gameinfo.Desk==gameInfo->Desk)
break;
}
if(PerHandleData->Socket==gameInfo->hHost)//找到所在游戏且是host
{strcpy(gameInfo->HostMsg,msginfo.Msg);
gameInfo->HostCount++;
printf("recv host msg %s\n",gameInfo->HostMsg);
if(gameInfo->HostCount==gameInfo->ClientCount)//同步,两者都收到才转发
{sprintf(log,"recv host msg %s\r\n",gameInfo->HostMsg);
AddLog(log,strlen(log));
printf("hostsend %d\n",gameInfo->HostCount);
sprintf(log,"hostsend %d\r\n",gameInfo->HostCount);
AddLog(log,strlen(log));
ZeroMemory(&msginfo, sizeof(MsgInfo));
strcpy(msginfo.Msg,gameInfo->HostMsg);
strcat(msginfo.Msg,gameInfo->ClientMsg);//合并消息
//找对端io结构
LPPER_IO_OPERATION_DATA lp_io=NULL;IO_POS pos;
m_io_group.GetHeadPosition( pos );
while( pos != NULL )
{lp_io = m_io_group.GetNext( pos );
if(lp_io->gameinfo.Sock==gameInfo->hClient)break;}
ZeroMemory(&(lp_io->Overlapped), sizeof(OVERLAPPED));
//合并消息后发消息
SendToClient(gameInfo->hHost,&(char&)msginfo,sizeof(MsgInfo),SERVER_SUCCESS,PerIoData);
SendToClient(gameInfo->hClient,&(char&)msginfo,sizeof(MsgInfo),SERVER_SUCCESS,lp_io);
}
}
else
{
if(PerHandleData->Socket==gameInfo->hClient)//找到所在游戏且是client
{strcpy(gameInfo->ClientMsg,msginfo.Msg);
gameInfo->ClientCount++;
printf("recv client msg %s\n",gameInfo->ClientMsg);
if(gameInfo->HostCount==gameInfo->ClientCount)//同步,两者都收到才转发
{sprintf(log,"recv client msg %s\r\n",gameInfo->ClientMsg);
AddLog(log,strlen(log));
printf("clientsend %d\n",gameInfo->ClientCount);
sprintf(log,"clientsend %d\r\n",gameInfo->ClientCount);
AddLog(log,strlen(log));
ZeroMemory(&msginfo, sizeof(MsgInfo));
strcpy(msginfo.Msg,gameInfo->HostMsg);
strcat(msginfo.Msg,gameInfo->ClientMsg);//合并消息
LPPER_IO_OPERATION_DATA lp_io=NULL;IO_POS pos;
m_io_group.GetHeadPosition( pos );
while( pos != NULL )
{lp_io = m_io_group.GetNext( pos );
if(lp_io->gameinfo.Sock==gameInfo->hHost)break;}
ZeroMemory(&(lp_io->Overlapped), sizeof(OVERLAPPED));
//发消息
SendToClient(gameInfo->hClient,&(char&)msginfo,sizeof(MsgInfo),SERVER_SUCCESS,PerIoData);
SendToClient(gameInfo->hHost,&(char&)msginfo,sizeof(MsgInfo),SERVER_SUCCESS,lp_io);
}
}
}
}
break;
case GAME_STATE_END://即logout消息
{
LPGameInfo gameInfo =NULL;
GameInfo_POS pos;
gameInfo_group.GetHeadPosition( pos );
while( pos != NULL )
{
gameInfo = gameInfo_group.GetNext( pos );
if(PerIoData->gameinfo.Room==gameInfo->Room&&PerIoData->gameinfo.Desk==gameInfo->Desk)
{printf("endgame %s\n",gameInfo->GameName);
sprintf(log,"endgame %s\r\n",gameInfo->GameName);
AddLog(log,strlen(log));
gameInfo_group.RemoveAt(gameInfo);//删除游戏记录
break;}
}
//继续接收消息
Flags = 0;
ZeroMemory(&(PerIoData->Overlapped), sizeof(OVERLAPPED));
PerIoData->DataBuf.len = sizeof(GameMsg);
PerIoData->DataBuf.buf = PerIoData->Buffer;
PerIoData->type =IOCP_RECV;
WSARecv(PerHandleData->Socket, &(PerIoData->DataBuf), 1, &RecvBytes, &Flags,
&(PerIoData->Overlapped), NULL);
}
break;
case GAME_STATE_EXIT:
{
LPGameInfo gameInfo =NULL;
GameInfo_POS pos;
gameInfo_group.GetHeadPosition( pos );
while( pos != NULL )
{
gameInfo = gameInfo_group.GetNext( pos );
if(PerIoData->gameinfo.Room==gameInfo->Room&&PerIoData->gameinfo.Desk==gameInfo->Desk)
{printf("endgame %s\n",gameInfo->GameName);
sprintf(log,"endgame %s\r\n",gameInfo->GameName);
AddLog(log,strlen(log));
gameInfo_group.RemoveAt(gameInfo);//删除游戏记录
break;}
}
printf("player:%s exit\n",PerIoData->gameinfo.Name);
sprintf(log,"player:%s exit\r\n",PerIoData->gameinfo.Name);
AddLog(log,strlen(log));
closesocket(PerHandleData->Socket);
m_key_group.RemoveAt(PerHandleData);
m_io_group.RemoveAt(PerIoData);
}
default:break;
}
}
break;
case IOCP_SEND://是发送消息,继续接收消息
{
Flags = 0;
ZeroMemory(&(PerIoData->Overlapped), sizeof(OVERLAPPED));
PerIoData->DataBuf.len = sizeof(GameMsg);
PerIoData->DataBuf.buf = PerIoData->Buffer;
PerIoData->type =IOCP_RECV;
WSARecv(PerHandleData->Socket, &(PerIoData->DataBuf), 1, &RecvBytes, &Flags,
&(PerIoData->Overlapped), NULL);
}
break;
default: break;
}
}
}
int SendToClient(SOCKET sock,char *buf,int buflen,int nType,LPPER_IO_OPERATION_DATA pConText)
{ //发消息的函数
DWORD SendBytes;
GameMsg *pNewPackage = (GameMsg*)new char[sizeof(GameMsg)];
ZeroMemory(pNewPackage,sizeof(GameMsg));
pNewPackage->MsgType=nType;
memcpy(pNewPackage->Buffer,buf,buflen);
pNewPackage->Size=buflen;
memcpy(pConText->Buffer,pNewPackage,sizeof(GameMsg));
pConText->type=IOCP_SEND;
pConText->DataBuf.buf=pConText->Buffer;
pConText->DataBuf.len=sizeof(GameMsg);
WSASend(sock, &(pConText->DataBuf), 1, &SendBytes, 0,&(pConText->Overlapped), NULL);
delete pNewPackage;
return 1;
}
void AddLog(const char *strInfo,DWORD size)
{
DWORD dwWaitResult = WaitForSingleObject (hMutex,INFINITE);
switch (dwWaitResult)
{
case WAIT_OBJECT_0:
{
CreateDirectory("LOG",NULL);
HANDLE hFile;
hFile=CreateFile("LOG\\Log.txt",GENERIC_WRITE,FILE_SHARE_WRITE,NULL,OPEN_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL);
if(hFile==INVALID_HANDLE_VALUE)
{
ReleaseMutex (hMutex);
return;
}
::SetFilePointer(hFile,NULL,NULL,FILE_END);
DWORD dwByte;
WriteFile(hFile,strInfo,size,&dwByte,NULL);
FlushFileBuffers(hFile);
CloseHandle(hFile);
hFile=NULL;
ReleaseMutex (hMutex);
return ;
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -