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);
	
	
}