171 lines
4.0 KiB
C++
Executable File
171 lines
4.0 KiB
C++
Executable File
/*******************************************************************************
|
|
This file is Part of the ZEngine Library for 2D game development.
|
|
Copyright (C) 2002, 2003 James Turk
|
|
|
|
Licensed under a BSD-style license.
|
|
|
|
The maintainer of this library is James Turk (james@conceptofzero.net)
|
|
and the home of this Library is http://www.zengine.sourceforge.net
|
|
*******************************************************************************/
|
|
|
|
/*!
|
|
\par File Header:
|
|
File: ZE_ZClient.cpp <br>
|
|
Description: Implementation source file for core ZEngine TCP Client Object. <br>
|
|
Author(s): James Turk <br>
|
|
$Id: ZE_ZClient.cpp,v 1.2 2003/03/14 22:20:13 cozman Exp $<br>
|
|
|
|
\file ZE_ZClient.cpp
|
|
\brief Source file for ZClient.
|
|
|
|
Implementation file for ZClient, the TCP Client class for ZEngine.
|
|
**/
|
|
|
|
#include "ZE_ZClient.h"
|
|
|
|
namespace ZE
|
|
{
|
|
|
|
string num2dotted4(unsigned int num)
|
|
{
|
|
vector<int> ip;
|
|
int d=256*256*256;
|
|
int m;
|
|
|
|
while(d > 0)
|
|
{
|
|
m = num/d;
|
|
num %= d;
|
|
ip.push_back(m);
|
|
d /= 256;
|
|
}
|
|
|
|
return FormatStr("%d.%d.%d.%d",ip[3],ip[2],ip[1],ip[0]);
|
|
}
|
|
|
|
ZClient::ZClient(bool verbose)
|
|
{
|
|
rEngine = ZEngine::GetInstance();
|
|
rSocket = NULL;
|
|
rSocketSet = NULL;
|
|
rVerbose = verbose;
|
|
rWaitTime = 0;
|
|
}
|
|
|
|
ZClient::~ZClient()
|
|
{
|
|
Disconnect();
|
|
}
|
|
|
|
bool ZClient::Connect(char *server, Uint16 port)
|
|
{
|
|
IPaddress ip;
|
|
|
|
if(SDLNet_ResolveHost(&ip,server,port) < 0)
|
|
rEngine->ReportError(ZERR_NET_CLIENT,FormatStr("Failed to resolve host: %s:%d",server,port));
|
|
else if(rVerbose)
|
|
rEngine->WriteLog(FormatStr("ZClient: resolved host: %s:%d",server,port));
|
|
|
|
rEngine->WriteLog(FormatStr("IP: %s",num2dotted4(ip.host).c_str()));
|
|
|
|
rSocket = SDLNet_TCP_Open(&ip); //try to open rSocket
|
|
|
|
if(!rSocket)
|
|
{
|
|
rEngine->ReportError(ZERR_NET_CLIENT,"Failed to open TCP socket.");
|
|
Disconnect();
|
|
return false;
|
|
}
|
|
|
|
rSocketSet = SDLNet_AllocSocketSet(1); //get a set for the single socket
|
|
if(!rSocketSet || SDLNet_TCP_AddSocket(rSocketSet,rSocket) == -1)
|
|
{
|
|
rEngine->ReportError(ZERR_NET_CLIENT,"Failed to create socket set.");
|
|
Disconnect();
|
|
return false;
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
void ZClient::Disconnect()
|
|
{
|
|
if(rSocket)
|
|
{
|
|
SDLNet_TCP_Close(rSocket);
|
|
rSocket = NULL;
|
|
}
|
|
if(rSocketSet)
|
|
{
|
|
SDLNet_FreeSocketSet(rSocketSet);
|
|
rSocketSet = NULL;
|
|
}
|
|
}
|
|
|
|
void ZClient::SetWaitTime(int wait)
|
|
{
|
|
rWaitTime = wait;
|
|
}
|
|
|
|
bool ZClient::Send(ZByte *data, int size)
|
|
{
|
|
int sent = 0;
|
|
|
|
if(rSocket)
|
|
{
|
|
sent = SDLNet_TCP_Send(rSocket,data,size);
|
|
|
|
if(sent < size)
|
|
{
|
|
rEngine->ReportError(ZERR_NET_CLIENT,FormatStr("Failed to send data, closing socket: %s", SDLNet_GetError()));
|
|
Disconnect();
|
|
return false;
|
|
}
|
|
else if(rVerbose)
|
|
rEngine->WriteLog(FormatStr("ZClient: Sent %d bytes to server.",sent));
|
|
|
|
return true;
|
|
}
|
|
else
|
|
{
|
|
rEngine->ReportError(ZERR_NOSOCKET,"Send");
|
|
return false;
|
|
}
|
|
}
|
|
|
|
int ZClient::Receive(ZByte *data)
|
|
{
|
|
int received = 0;
|
|
|
|
if(rSocket)
|
|
{
|
|
if(SDLNet_CheckSockets(rSocketSet, rWaitTime) > 0 && SDLNet_SocketReady(rSocket))
|
|
{
|
|
received = SDLNet_TCP_Recv(rSocket,data,MAX_MSG_LEN);
|
|
if(received <= 0)
|
|
{
|
|
Disconnect();
|
|
rEngine->ReportError(ZERR_NET_CLIENT,FormatStr("TCP_Recv failed [%s]",SDLNet_GetError()));
|
|
}
|
|
else if(rVerbose)
|
|
rEngine->WriteLog(FormatStr("ZClient: received %d bytes.",received));
|
|
}
|
|
}
|
|
else
|
|
rEngine->ReportError(ZERR_NOSOCKET,"Receive");
|
|
|
|
return received;
|
|
}
|
|
|
|
bool ZClient::Connected()
|
|
{
|
|
return rSocket?true:false;
|
|
}
|
|
|
|
int ZClient::WaitTime()
|
|
{
|
|
return rWaitTime;
|
|
}
|
|
|
|
} //namespace ZE
|