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

📄 iocmplt.cpp

📁 由本人编写的一个完成端口测试程序
💻 CPP
📖 第 1 页 / 共 2 页
字号:
		  {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 + -