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