www.pudn.com > ChatUseIOCP.rar > ChatServerSocket.cpp


#include "StdAfx.h" 
#include ".\chatserversocket.h" 
#include "ChatProtocol.h" 
 
CChatServerSocket::CChatServerSocket(void) 
{ 
} 
 
CChatServerSocket::~CChatServerSocket(void) 
{ 
} 
 
/// @param pClient Should return a pointer to a DtServerSocketClient derived class. 
void CChatServerSocket::LoadClient(Datatal::DtServerSocketClient** pClient, int& nId) 
{ 
 
	CChatServerClient* pNewClient = new CChatServerClient; 
	if (pNewClient) 
	{ 
 
		// You may call whatever you want to init the server client. 
		// we may change the id to something nice, put we like the current one (just a counter value) 
 
	}  
	else 
	{ 
 
		char szLog[128]; 
		sprintf(szLog, "Failed to load hvd client %d", nId); 
		throw Datatal::DtServerException(-1, "LoadClient", szLog); 
 
	}// if (pNewClient) 
 
	*pClient = pNewClient; 
} 
 
/// Will generate a list with all login users. 
/// @param pszBuffer  
void CChatServerSocket::GetUserList(char* pszBuffer, size_t nBufSize) 
{ 
	size_t nCurSize = 0; 
	CChatServerClient* pClient; 
	pszBuffer[0] = NULL; 
 
	for (int i = 0; i < (int)m_paClients.size(); i++) 
	{ 
		pClient = (CChatServerClient*)m_paClients[i]; 
 
		if (!pClient->IsConnected()) 
			continue; 
 
		// Check if it fit in the buffer. 
		if (pClient->GetUserName().length() + nCurSize > nBufSize) 
			return; 
 
		strcat(pszBuffer, pClient->GetUserName().c_str()); 
		strcat(pszBuffer, "\04"); 
	} 
} 
 
 
/// Send a message to a user. 
void CChatServerSocket::SendMessage(const char* pszFrom, const char* pszTo, const char* pszMessage) 
{ 
	CChatServerClient* pClient; 
	for (int i = 0; i < (int)m_paClients.size(); i++) 
	{ 
		pClient = (CChatServerClient*)m_paClients[i]; 
		if (pClient->IsConnected()) 
		{ 
			if (strcmp(pClient->GetUserName().c_str(), pszTo) == 0) 
				pClient->SendMessage(pszFrom, pszTo, pszMessage); 
		} 
	} 
 
} 
 
 
/// Send a message to everyone. 
void CChatServerSocket::SendMessage(const char* pszFrom, const char* pszMessage) 
{ 
	CChatServerClient* pClient; 
	for (int i = 0; i < (int)m_paClients.size(); i++) 
	{ 
		pClient = (CChatServerClient*)m_paClients[i]; 
		if (pClient->IsConnected()) 
			pClient->SendMessage(pszFrom, "all", pszMessage); 
	} 
 
} 
 
void CChatServerSocket::OnWriteLog(int nPrio, int nClientId, const char* pszCategory, const char* pszString) const 
{ 
	printf("(%d) %d (%s)      %s\n", nPrio, nClientId, pszCategory, pszString); 
} 
 
/// Send userlist to everyone. 
void CChatServerSocket::SendUserList(CChatServerClient* pNotToMe) 
{ 
	char szBuffer[1024]; 
	szBuffer[0] = NULL; 
	GetUserList(szBuffer, 1024); 
 
	CChatServerClient* pClient; 
 
	ChatProtocol::Packet OutPacket; 
	OutPacket.nFunctionCode = ChatProtocol::TC_LIST_USERS; 
	ChatProtocol::SetPacketBuffer(OutPacket, szBuffer, (int)strlen(szBuffer)); 
 
	for (int i = 0; i < (int)m_paClients.size(); i++) 
	{ 
		pClient = (CChatServerClient*)m_paClients[i]; 
 
		//dont send to disconnected, or to the source. 
		if (!pClient->IsConnected() || (pNotToMe && pClient == pNotToMe)) 
			continue; 
 
		pClient->Send(OutPacket); 
	} 
}