www.pudn.com > Five_QT_by_CT.rar > server.cpp
#include "server.h"
Master::Master()
{
}
//专门接收数据的函数
void Master :: Receiver()
{
struct sockaddr_in servaddr,cliaddr;
int sockfd,recvnum;
socklen_t clilen;
char bufrecv[BUF_LEN];
clilen=sizeof(struct sockaddr);
char port[5];
//准备连接
sockfd=socket(AF_INET,SOCK_DGRAM,0);
if(sockfd==-1)
{
perror("socket");
//exit();
}
bzero(&servaddr,sizeof(servaddr));
bzero(&cliaddr,sizeof(cliaddr));
servaddr.sin_family=AF_INET;
servaddr.sin_addr.s_addr=htonl(INADDR_ANY);
servaddr.sin_port=htons(1500);
if(bind(sockfd,(struct sockaddr*)&servaddr,sizeof(struct sockaddr))==-1)
{
perror("bind");
//exit();
}
mSockFD=sockfd;
//接收数据
for(;;)
{
printf("waiting for datagram...\n");
recvnum=recvfrom(sockfd,bufrecv,BUF_LEN,0,(struct sockaddr *)&mCliaddr,&clilen);
if(recvnum==-1)
{
perror("recvmsg");
//exit();
}
strncpy(mRevBuf,bufrecv,recvnum);
printf("mRecvBuf:%s",mRevBuf);
printf("\nunPacker ::%d\n",mPackDisposer.MsgUnPacker(mMsgRecvd,mRevBuf));
printf("%s\n%s\n%s\n",mMsgRecvd.mID.ascii(),
mMsgRecvd.mRequest.ascii(),
mMsgRecvd.mContent.ascii());
sprintf(port,"%d",ntohs(cliaddr.sin_port));
printf("port:%s\n",port);
sleep(1);
//每接收到一个包调Disposer()来处理;
printf("Disposer:%d\n",Disposer());
}
}
//分发器
int Master::Disposer()
{
if(!mMsgRecvd.mRequest.compare(QString("login")))
HandleLogin();
if(!mMsgRecvd.mRequest.compare(QString("quit")))
HandleQuit();
if(!mMsgRecvd.mRequest.compare(QString("changeseat")))
HandleChangeseat();
return 123;
}
//Sender将msg打包(格式化)后发送到dstaddr
int Master::Sender(Message msg, struct sockaddr_in dstaddr)
{
int sockfd=socket(AF_INET,SOCK_DGRAM,0);
mPackDisposer.MsgPacker(msg,mSndBuf);
int sendnum;
sendnum =sendto(sockfd,mSndBuf,BUF_LEN,0,(struct sockaddr *)&dstaddr,sizeof(struct sockaddr));
if(sendnum<0)
{
perror("sendto");
}
printf("send, %s to %s, %d\n",mSndBuf,inet_ntoa(dstaddr.sin_addr),ntohs(dstaddr.sin_port));
return 0;
}
//让所有客户更新大厅
int Master::UpdateHall()
{
int i,k,templen;
char p[BUF_LEN];
Message msg;
struct sockaddr_in dstaddr;
//找到在线客户,逐个发送更新信息 算法代改进
for(i=2;i=MAX_PLAYER)
return -1;
else
{
sprintf(ID,"%d",i);
}
//modify mPlayerTable[]
AddPlayerTableEntry(ID, QString(addr), QString(port));
//send feedback
mMsgToSend.mID=QString("1");
mMsgToSend.mRequest=QString("login");
mMsgToSend.mContent=ID;
printf("in login,going to send\n");
Sender(mMsgToSend, mCliaddr);
//向所有客户更新大厅信息
UpdateHall();
}
int Master::HandleQuit()
{
int i;
QString id=mMsgRecvd.mID;
//找到ID
for( i=2;i=len)
printf("in handleChangeseat, get deskinfo error\n");
ptr[i-1]='\0';
QString dsknum = QString(&buffer[n]);
n+=i;
ptr=&buffer[0];
while(ptr[i++]!='&')
if(i>=len)
printf("in handleChangeseat, get deskinfo error\n");
ptr[i-1]='\0';
QString side = QString(&buffer[n]);
n+=i;
Message msg;
printf("mDeskTable[dsknum.toInt()].mWhiteID %s\nmDeskTable[dsknum.toInt()].mBlackID %s\n side %s\n",mDeskTable[dsknum.toInt()].mWhiteID.ascii(),mDeskTable[dsknum.toInt()].mBlackID.ascii(), side.ascii());
//找到客户当前桌位信息,(含第一次坐下的情况)
int index=mMsgRecvd.mID.toInt();
QString curdesk=mPlayerTable[index].mDeskNumber;
QString curside=mPlayerTable[index].mSide;
if(dsknum.compare(curdesk)==0&&side.compare(curside)==0)
return ;
//判断该座是否被占 发送reply信息
if(((mDeskTable[dsknum.toInt()].mWhiteID.compare("-1")==0 )&& (side.compare("white")==0))
||((mDeskTable[dsknum.toInt()].mBlackID.compare("-1")==0 )&& (side.compare("black")==0)))
{
msg.mContent=QString("succeed");
//如果没有被占
//更新playertable信息
AddPlayerChangeseatEntry(mMsgRecvd.mID, dsknum, side, curdesk, curside);
//让所有客户更新信息,这里是全部更新,应该是部分更新,待改进
UpdateHall();
}
else
msg.mContent=QString("failed");
msg.mID=QString("1");
msg.mRequest=QString("rechangeseat");
Sender(msg, mCliaddr);
}