예제 #1
0
C4ClientList &C4ClientList::operator =(const C4ClientList &List)
{
	// remove clients that are not in the list
	C4Client *pClient, *pNext;
	for (pClient = pFirst; pClient; pClient = pNext)
	{
		pNext = pClient->pNext;
		if (!List.getClientByID(pClient->getID()))
		{
			Remove(pClient);
			delete pClient;
		}
	}
	// add all clients
	for (pClient = List.pFirst; pClient; pClient = pClient->pNext)
	{
		// already in list?
		C4Client *pNewClient = getClientByID(pClient->getID());
		if (pNewClient)
		{
			// core change
			pNewClient->SetCore(pClient->getCore());
		}
		else
		{
			// add
			pNewClient = Add(pClient->getCore());
		}
	}
	return *this;
}
예제 #2
0
char* bb_clientGetLastMessage(unsigned long clientID)
{
	cClient *c = getClientByID(clientID);

	if(!c) return 0;
	return c->GetLastMessage();
}
예제 #3
0
char* bb_clientGetLastMessage(UINT4 clientID)
{
	cClient *c = getClientByID(clientID);

	if(!c) return 0;
	return c->GetLastMessage();
}
예제 #4
0
unsigned long bb_clientGetBytesReceived(unsigned long clientID)
{
	cClient *c = getClientByID(clientID);

	if(c) return c->BytesReceived;
	return 0;
}
예제 #5
0
UINT4 bb_clientGetBytesReceived(UINT4 clientID)
{
	cClient *c = getClientByID(clientID);

	if(c) return c->BytesReceived;
	return 0;
}
예제 #6
0
unsigned long bb_clientGetBytesSent(unsigned long clientID)
{
	cClient *c = getClientByID(clientID);

	if(!c) return 0;

	return c->BytesSent;

}
예제 #7
0
UINT4 bb_clientGetBytesSent(UINT4 clientID)
{
	cClient *c = getClientByID(clientID);

	if(!c) return 0;

	return c->BytesSent;

}
예제 #8
0
C4Client *C4ClientList::Add(const C4ClientCore &Core)
{
	// client with same ID in list?
	if (getClientByID(Core.getID()))
		{ Log("ClientList: Duplicated client ID!"); return NULL; }
	// create, add
	C4Client *pClient = new C4Client(Core);
	Add(pClient);
	return pClient;
}
예제 #9
0
int	bb_clientSend(unsigned long clientID,char* dataToSend,int dataSize,int typeID,int protocol)
{
	cClient *c = getClientByID(clientID);

	if(!c)	return 1;

	c->CreatePacket(new cPacket(dataToSend,dataSize,(unsigned short)typeID),c->UDPenabled ? (protocol ? true : false) : false);

	return 0;
}
예제 #10
0
int	bb_clientSetRate(unsigned long clientID,int nbBytes)
{
	cClient *c = getClientByID(clientID);

	if(!c) return 1;

	c->DataRate	=	(unsigned short)nbBytes;

	return 0;
}
예제 #11
0
char* bb_clientGetLastError(UINT4 clientID)
{

	cClient *c = getClientByID(clientID);

	if(!c)
	{
		return serror;
	}
	return c->GetLastError();
}
예제 #12
0
void C4ClientList::Add(C4Client *pClient)
{
	// local client?
	if (pClient->isLocal()) pLocal = pClient;
	// already in list?
	assert(!getClientByID(pClient->getID()));
	// find insert position
	C4Client *pPos = pFirst, *pPrev = NULL;
	for (; pPos; pPrev = pPos, pPos = pPos->pNext)
		if (pPos->getID() > pClient->getID())
			break;
	// add to list
	pClient->pNext = pPos;
	(pPrev ? pPrev->pNext : pFirst) = pClient;
	// register to network
	if (pNetClients)
		pClient->pNetClient = pNetClients->RegClient(pClient);
}
예제 #13
0
int bb_clientDisconnect(unsigned long clientID)
{
	if(!MainClients) return 1;

	cClient *c = getClientByID(clientID);

	if(!c) return 1;

	c->Disconnect();


	if(c->Next)		c->Next->Previous = c->Previous;
	if(c->Previous)		c->Previous->Next = c->Next;


	if(c == MainClients) MainClients = MainClients->Next;

	delete c;
	
	return 0;
}
예제 #14
0
char* bb_clientReceive(unsigned long clientID,int *typeID)
{

	cClient *c = getClientByID(clientID);

	if(!c)
	{
		*typeID = 0;
		return 0;
	}

	cPacket* p=0;

	//on va checker les packet qui vienne des client qui sont pret a etre recu
	p = c->GetReadyPacket();
	if(p)
	{
		*typeID = p->TypeID;
		return p->Data == 0 ? (char *)1 : p->Data;
	}


	return 0;
}
예제 #15
0
int bb_clientUpdate(unsigned long clientID,float elapsed,int updateMsg)
{
	cClient *c = getClientByID(clientID);

	if(!c) return 1;

	sprintf(c->LastMessage,"");
	sprintf(c->LastError,"");



	if(c->isConnected)
	{
		switch(updateMsg)
		{
			case UPDATE_SEND_RECV:
			{
				//on recois UDP du serveur
				//UDPserver->ReceiveFromSocket( Server ? 20 : 50 );

				//on recois TCP/UDP du serveur
				int r = c->ReceivePacketsFromServer();
				if(r) return r;
			
				//on envoi au serveur TCP/UDP
				if(c->SendPacketsToServer()) return 1;

				return 0;
			}
			case UPDATE_SEND:
			{
				//on envoi au serveur TCP/UDP
				if(c->SendPacketsToServer()) return 1;
				return 0;
			}
			case UPDATE_RECV:
			{
				//on recois UDP du serveur
				//UDPserver->ReceiveFromSocket( Server ? 20 : 40 );

				//on recois TCP/UDP du serveur
				int r = c->ReceivePacketsFromServer();
				if(r) return r;
				return 0;
			}
		}
	}
	else	//on est pas encore connecter
	{
		int r = c->UpdateConnection(elapsed);
		
		if(r==2)	//connection reussi!
		{
			c->isConnected = true;
			return 3;
		}

		if(r==1)	//erreur pendant la connection
		{
			c->isConnected = false;
			return 1;
		}
	}

	return 0;
}
예제 #16
0
void update(float dt) {
	int clientsCount = clients.size();
	lockMutex( clientsMutex );
	for ( Uint32 i = 0; i < clients.size(); i++ ) {
		lockMutex( clients[i]->mutex );
		if ( clients[i]->recvSize > 2 ) {
			int readPos = clients[i]->startPos;
			if ( readPos >= BUFFER_SIZE )
				readPos -= BUFFER_SIZE;
			char msgType = clients[i]->msg[readPos];
			readPos++;
			if ( readPos >= BUFFER_SIZE )
				readPos -= BUFFER_SIZE;
			char msgLength = clients[i]->msg[readPos];
			if ( msgLength <= clients[i]->recvSize - 2 ) {
				char * data = (char*) malloc( msgLength+1 );
				for ( Uint16 j = 0; j < msgLength; j++ ) {
					readPos++;
					if (readPos >= BUFFER_SIZE)
						readPos -= BUFFER_SIZE;
					data[j] = clients[i]->msg[readPos];
				}
				readPos++;
				if ( readPos >= BUFFER_SIZE )
					readPos -= BUFFER_SIZE;
				clients[i]->startPos  = readPos;
				clients[i]->recvSize -= msgLength+2;
				
				data[msgLength] = 0;
				void* dat = data;
				printf( "Decoded message type %c:%X\n", msgType, (unsigned)msgType );
				switch ( msgType ) {
					case 'm':
						printf( "%s: %s\n", clients[i]->address, data );
						break;
					case 'b':
						broadcast( 'm', data, msgLength );
						break;
					case B_NEWPLAYER:{
						unsigned int id = clients[i]->ID;
						send ( &clients[i]->socket, B_NEWPLAYERID, &id, sizeof( unsigned int ) );
						float* pos = (float*) data;
						(float)pos[3] = (float) clients[i]->ID;
						printf("New player. ID: %i\n", clients[i]->ID);
						broadcastExcept( clients[i]->socket, B_NEWPLAYER, data, sizeof(float)*4 );
						break;
						}
					case B_FORNEWBIE:{
						Uint8 id = ((float*)dat)[8];
						Client* dest = getClientByID(id);
						if (dest != NULL) {
							send( &dest->socket, B_FORNEWBIE, dat, msgLength );
						}
						break;
					}
					case B_PLAYERTURN:{
						broadcastExcept ( clients[i]->socket, B_PLAYERTURN, dat, msgLength );
						break;
					}
					case B_PLAYERTURNZ:
						broadcastExcept ( clients[i]->socket, B_PLAYERTURNZ, dat, msgLength );
						break;
				}
			}
		}
		unlockMutex( clients[i]->mutex );
	}
	unlockMutex( clientsMutex );
}