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

📄 rainsock.cpp

📁 好用的键盘超人源代码
💻 CPP
📖 第 1 页 / 共 2 页
字号:
   struct command server_str;
   int i,ret;
   
   for(i=0;i<len;i++)
   {
	   server_str.content.s_str.string[i]=str[i];
   }
   server_str.content.s_str.strlen=len;
   server_str.content.s_str.whereX=whereX;
   server_str.content.s_str.sequence=seq;
   server_str.type=COM_S_STR;

   for(i=0;i<DFT_CLIENT_NUM;i++)
   {
	  
     if(slaveSocket[i].getConnectState()!=CONNECTION_LOST)
     {
        ret=slaveSocket[i].Send((UCHAR*)&server_str,sizeof(server_str),0);
     }
   }
}

void CRainMSSock::begin(int stepTimer)
{
    struct command server_begin;
    int i,ret;

	server_begin.type=COM_S_BEGIN;
	server_begin.content.s_begin.stepTime=stepTimer;
	for(i=0;i<DFT_CLIENT_NUM;i++)
    {
	  
      if(slaveSocket[i].getConnectState()!=CONNECTION_LOST)
      {
        server_begin.content.s_begin.usrID=slaveSocket[i].usrID;  
        ret=slaveSocket[i].Send((UCHAR*)&server_begin,sizeof(server_begin),0);
      }
    }
    
	// PDocument->tick_timer=0;//think:put here right ? 

}

void CRainMSSock::end()
{
	struct command server_end;
	int i,ret;
	int usrNumber;

	//fill server result
	server_end.type=COM_S_END;
    server_end.content.s_end.totalStr=PDocument->getTotalStrNum();
	server_end.content.s_end.totalTime=PDocument->getTotalTime(); 
	server_end.content.s_end.usrResult[0].usrIP=inet_addr(myIP);
    strcpy(server_end.content.s_end.usrResult[0].usrName,PDocument->localUsrName);
    server_end.content.s_end.usrResult[0].rightStr=rightStr;//PDocument->server.rightStr;
    server_end.content.s_end.usrResult[0].rightChar=rightChar;//PDocument->server.rightChar;
    server_end.content.s_end.usrResult[0].usrID=usrID;
    //fill client result
	usrNumber=1;
    for(i=0;i<DFT_CLIENT_NUM;i++)
    { 
       if(slaveSocket[i].getConnectState()!=CONNECTION_LOST)
       {
         server_end.content.s_end.usrResult[usrNumber].usrIP=
			 inet_addr(slaveSocket[i].usrIP);
		 strcpy(server_end.content.s_end.usrResult[usrNumber].usrName,
			 slaveSocket[i].usrName);
		 server_end.content.s_end.usrResult[usrNumber].rightStr=
			 slaveSocket[i].rightStr;
		 server_end.content.s_end.usrResult[usrNumber].rightChar=
			 slaveSocket[i].rightChar;
		 server_end.content.s_end.usrResult[usrNumber].usrID=
			 slaveSocket[i].usrID;
         usrNumber++;
       }
    } 
    server_end.content.s_end.usrNumber=usrNumber;

	//send end command to clients
    for(i=0;i<DFT_CLIENT_NUM;i++)
    { 
      if(slaveSocket[i].getConnectState()!=CONNECTION_LOST)
      {
        ret=slaveSocket[i].Send((UCHAR*)&server_end,sizeof(server_end),0);
      }
    }
}

int CRainMSSock::checkUsrHit(ULONG hitStrSeq,ULONG hitTickTimer)
{
   int i,j;

   // check server
   for(i=0;i<RAIN_Y;i++) 
   {
      if(hitStrList[i].state)
	  {	  
	     if(hitStrSeq==hitStrList[i].hitStrSeq)
         {
			 int x=hitStrList[i].hitTickTimer;//
		     if(hitTickTimer<hitStrList[i].hitTickTimer)
			 {
				//find string old than me
                hitStrList[i].state=0;
                continue;
			 }
		     else
			 {
				//in this case,the hit string do nothing
                return 0; 
			 }  
         }
	  }	 
   }

   // check client
   for(j=0;j<DFT_CLIENT_NUM;j++)
   {
      for(i=0;i<RAIN_Y;i++) 
	  {
         if(slaveSocket[j].hitStrList[i].state)
		 {	  
	        if(hitStrSeq==slaveSocket[j].hitStrList[i].hitStrSeq)
			{
		        if(hitTickTimer<slaveSocket[j].hitStrList[i].hitTickTimer)
				{
                   //find string old than me
                   slaveSocket[j].hitStrList[i].state=0;
                   continue;
				}
		        else
				{
                   //in this case,the hit string do nothing
                   return 0; 
				}  
			}
		 }	 
	  }
   }   

   return 1;
}

void CRainMSSock::insertUsrHit(ULONG hitStrSeq,ULONG hitTickTimer,int hitStrLen)
{
      int i;

	  for(i=0;i<RAIN_Y;i++)
      {
		 if(hitStrList[i].state==0)
         {
              hitStrList[i].state=1;
              hitStrList[i].hitStrSeq=hitStrSeq;
              hitStrList[i].hitTickTimer=hitTickTimer;
			  hitStrList[i].hitStrLen=hitStrLen;
			  break;
		 }
	  }
}

void CRainMSSock::initUsrHit()
{
	int i,j;

	for(i=0;i<RAIN_Y;i++)
    {
		hitStrList[i].state=0;
	}

	for(j=0;j<DFT_CLIENT_NUM;j++)
    {
        for(i=0;i<RAIN_Y;i++)
        {
			slaveSocket[j].hitStrList[i].state=0;
		}
	}

}

/////////////////////////////////////////////////////////////////////////////
// CRainCSock
CRainCSock::CRainCSock()
{
	isSockCreated=0;
	init();
}

CRainCSock::~CRainCSock()
{
}

void CRainCSock::init()
{
	serverIP="";
    
    usrNumber=0; 

	if(isSockCreated)
    {
	   Close();
    }
	setConnectState(CONNECTION_LOST);
}

BOOL CRainCSock::Connect( LPCTSTR lpszHostAddress, UINT nHostPort )
{
	int ret;
    
	ret=CRainSock::Connect(lpszHostAddress,nHostPort);
	if(ret)
    {
		return 1;
    }
	else
    {
       if(GetLastError()==WSAEWOULDBLOCK)
       {
		   //maybe set connection state here
		   return 1;
       } 
	   else
       {
		   return 0;
       }
	}	
}

void CRainCSock::OnReceive(int nErrorCode)
{
	char buffer[1024];
    int ret,i,j;
	struct command *pComm;
	struct command client_ack;
	struct in_addr addr;
	 
    CRainView *pView;
	POSITION  pos;

	if(nErrorCode)
    {
#if DEBUG_RAIN
	   TRACE("OnReceive error code:%x\n",nErrorCode);
#endif
	   return;
	}
#if DEBUG_RAIN
	TRACE("OnReceive\n"); 
#endif

	setConnectState(CONNECTION_SAFE);

	ret=Receive(buffer,sizeof(struct command),0);//
	pComm=(struct command *)buffer;
	switch(pComm->type)
    {
    case COM_S_REQ:
		 PDocument->tick_timer=0;//think:put here right ?
		 usrNumber=pComm->content.s_req.usrNumber;
		 for(i=0;i<usrNumber;i++)
         {
            addr.S_un.S_addr=pComm->content.s_req.usrInfo[i].usrIP; 
			usrIP[i]=inet_ntoa(addr);
			usrName[i]=pComm->content.s_req.usrInfo[i].usrName;
			// check hit str here
            for(j=0;j<pComm->content.s_req.usrInfo[i].hitNumber;j++)
			{
				if(usrID==pComm->content.s_req.usrInfo[i].usrID)
                {  
				   PDocument->strHitAck(pComm->content.s_req.usrInfo[i].hitStrSeq[j],usrName[i],0);
                }
				else
                {
				   PDocument->strHitAck(pComm->content.s_req.usrInfo[i].hitStrSeq[j],usrName[i],1);
				} 	
			}

		 }
		 break;
    case COM_S_STR:
		 PDocument->insertStr(pComm->content.s_str.string,
			                  pComm->content.s_str.strlen,
							  pComm->content.s_str.whereX,
							  pComm->content.s_str.sequence);
		 //maybe some msg here
		 break; 
	case COM_S_BEGIN:
		 //PDocument->tick_timer=0;//think:put here right ?
		 pos=PDocument->GetFirstViewPosition();
		 pView=(CRainView*)PDocument->GetNextView(pos);
         pView->timeLeft=BEGIN_TIME;
		 pView->stateDlg.close();
		 PDocument->stepTime=pComm->content.s_begin.stepTime;
		 usrID=pComm->content.s_begin.usrID;
		 PDocument->setRainState(RS_BEGINNING);
		 PDocument->setRainMsg(BEGINNING_MSG);
		 break;
	case COM_S_END:
         totalStr=pComm->content.s_end.totalStr;
		 totalTime=pComm->content.s_end.totalTime;
		 usrNumber=pComm->content.s_end.usrNumber;
         for(i=0;i<usrNumber;i++)
         {
             rightStr[i]=pComm->content.s_end.usrResult[i].rightStr;
			 rightChar[i]=pComm->content.s_end.usrResult[i].rightChar;
             allUsrID[i]=pComm->content.s_end.usrResult[i].usrID;
		 }
		 PDocument->setRainState(RS_STOPPING);
		 PDocument->setRainMsg(STOPPING_MSG);
		 break; 
    default:
#if DEBUG_RAIN
		TRACE("unknown command type:0x%x",pComm->type);
#endif		
	}

    client_ack.type=COM_C_ACK;
	client_ack.content.c_ack.usrIP=inet_addr(myIP);
	strcpy(client_ack.content.c_ack.usrName,PDocument->localUsrName);
	ret=Send((UCHAR*)&client_ack,sizeof(client_ack),0);
}

void CRainCSock::OnConnect(int nErrorCode)
{
	if(nErrorCode)
    {
#if DEBUG_RAIN
	   TRACE("OnConnect error code:%x\n",nErrorCode);
#endif
       return;
    }
}

void CRainCSock::hit(ULONG hitStrSeq,ULONG hitTickTimer,int hitStrLen)
{
   struct command client_hit;
   int ret;
    
   client_hit.type=COM_C_HIT;
   client_hit.content.c_hit.hitStrSeq=hitStrSeq;
   client_hit.content.c_hit.hitTickTimer=hitTickTimer;
   client_hit.content.c_hit.hitStrLen=hitStrLen;   
   ret=Send((UCHAR*)&client_hit,sizeof(client_hit),0);
}

⌨️ 快捷键说明

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