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