mcserver/source/cBlockingTCPLink.cpp

151 lines
2.5 KiB
C++

#include "Globals.h" // NOTE: MSVC stupidness requires this to be the same across all modules
#include "cBlockingTCPLink.h"
#include "packets/cPacket.h"
#ifdef _WIN32
#define MSG_NOSIGNAL (0)
#endif
#ifdef __MACH__
#define MSG_NOSIGNAL (0)
#endif
cBlockingTCPLink::cBlockingTCPLink(void)
{
}
cBlockingTCPLink::~cBlockingTCPLink()
{
CloseSocket();
}
void cBlockingTCPLink::CloseSocket()
{
if (!m_Socket.IsValid())
{
m_Socket.CloseSocket();
}
}
bool cBlockingTCPLink::Connect(const char * iAddress, unsigned int iPort)
{
ASSERT(!m_Socket.IsValid());
if (m_Socket.IsValid())
{
LOGWARN("WARNING: cTCPLink Connect() called while still connected.");
m_Socket.CloseSocket();
}
struct hostent *hp;
unsigned int addr;
struct sockaddr_in server;
m_Socket = socket(AF_INET, SOCK_STREAM, 0);
if (!m_Socket.IsValid())
{
LOGERROR("cTCPLink: Cannot create a socket");
return false;
}
addr = inet_addr(iAddress);
hp = gethostbyaddr((char *)&addr, sizeof(addr), AF_INET);
if (hp == NULL)
{
//LOGWARN("cTCPLink: gethostbyaddr returned NULL");
hp = gethostbyname(iAddress);
if (hp == NULL)
{
LOGWARN("cTCPLink: Could not resolve %s", iAddress);
CloseSocket();
return false;
}
}
server.sin_addr.s_addr = *((unsigned long *)hp->h_addr);
server.sin_family = AF_INET;
server.sin_port = htons( (unsigned short)iPort);
if (connect(m_Socket, (struct sockaddr *)&server, sizeof(server)))
{
LOGWARN("cTCPLink: Connection to \"%s:%d\" failed (%s)", iAddress, iPort, cSocket::GetErrorString( cSocket::GetLastError() ).c_str() );
CloseSocket();
return false;
}
return true;
}
int cBlockingTCPLink::Send(char * a_Data, unsigned int a_Size, int a_Flags /* = 0 */ )
{
ASSERT(m_Socket.IsValid());
if (!m_Socket.IsValid())
{
LOGERROR("cBlockingTCPLink: Trying to send data without a valid connection!");
return -1;
}
return m_Socket.Send(a_Data, a_Size);
}
int cBlockingTCPLink::SendMessage( const char* a_Message, int a_Flags /* = 0 */ )
{
ASSERT(m_Socket.IsValid());
if (!m_Socket.IsValid())
{
LOGWARN("cBlockingTCPLink: Trying to send message without a valid connection!");
return -1;
}
return m_Socket.Send(a_Message, strlen(a_Message));
}
void cBlockingTCPLink::ReceiveData(AString & oData)
{
ASSERT(m_Socket.IsValid());
if (!m_Socket.IsValid())
{
return;
}
int Received = 0;
char Buffer[256];
while ((Received = recv(m_Socket, Buffer, sizeof(Buffer), 0)) > 0)
{
oData.append(Buffer, Received);
}
}