97 lines
3.6 KiB
C++
97 lines
3.6 KiB
C++
#include <capserver/gensrv.hpp>
|
|
#include <common/string.hpp>
|
|
#include <common/systime.hpp>
|
|
|
|
extern bool running;
|
|
|
|
GenericServer::GenericServer(void)
|
|
: mIsRunning(TRUE)
|
|
{
|
|
}
|
|
|
|
GenericServer::~GenericServer()
|
|
{
|
|
message("[GenericServer::~GenericServer]Server is destructing...");
|
|
}
|
|
|
|
void GenericServer::close(void)
|
|
{
|
|
mIsRunning=FALSE;
|
|
}
|
|
|
|
WORD GenericServer::listen(const String &hostName,short portNum)
|
|
{
|
|
HostEnt hostEntry;
|
|
ServEnt serverEntry;
|
|
String stringData;
|
|
SystemTime systemTime;
|
|
DWORD elapsedTime;
|
|
|
|
message(String("[GenericServer::listen]trying host'")+hostName+String("'..."));
|
|
if(!mWSASystem.isInitialized()){message("[GenericServer::listen]WINSOCK initialization failure.");return FALSE;}
|
|
InternetAddress internetAddress(hostName);
|
|
if(!internetAddress.isZero()){if(!hostEntry.hostByAddress(internetAddress)){message(String("[GenericServer::listen]no DNS entry for ")+hostName);return FALSE;}}
|
|
else if(!hostEntry.hostByName(hostName)){message(String("[GenericServer::listen]no DNS entry for ")+hostName);return FALSE;}
|
|
message(String("[GenericServer::listen]connect...")+String("'")+hostEntry.hostName()+String("' (")+(String)(hostEntry.addresses())[0]+String(")"));
|
|
mInternetSocketAddress.internetAddress((hostEntry.addresses())[0]);
|
|
mInternetSocketAddress.family(PF_INET);
|
|
mInternetSocketAddress.port(portNum);
|
|
if(!mGenericControl.create()){message("[GenericServer::listen]socket initialization failure.");return FALSE;}
|
|
mGenericControl.reuseAddress();
|
|
if(!mGenericControl.bind(mInternetSocketAddress)){message("[GenericServer::listen]bind failed");return FALSE;}
|
|
while(mIsRunning&&running)
|
|
{
|
|
SmartPointer<Socket> socketControl;
|
|
socketControl=::new Socket();
|
|
// socketControl.disposition(PointerDisposition::Assume);
|
|
socketControl.disposition(PointerDisposition::Delete);
|
|
INETSocketAddress internetSocketAddress;
|
|
message(String("[GenericServer::listen]host='")+(hostEntry.addresses())[0]+String("' port=")+String().fromInt(portNum));
|
|
String strLocalHost((String)mInternetSocketAddress.internetAddress());
|
|
message(String("[GenericServer::listen]local address is ")+strLocalHost);
|
|
if(!mGenericControl.listen()){message("[GenericServer::listen]listen failed");return FALSE;}
|
|
message("[GenericServer::listen]waiting for connection...");
|
|
if(!mGenericControl.accept(*socketControl,internetSocketAddress)){message("[GenericServer::listen]accept returned FALSE;");return FALSE;}
|
|
|
|
// socketControl->setLinger(0);
|
|
// socketControl->bind(internetSocketAddress);
|
|
|
|
systemTime.refresh();
|
|
message(String("[GenericServer::listen]service started from ")+internetSocketAddress.internetAddress().toString()+String(" on ")+systemTime.toString());
|
|
elapsedTime=::GetTickCount();
|
|
acceptHandler(socketControl);
|
|
socketControl->destroy();
|
|
socketControl.destroy();
|
|
elapsedTime=::GetTickCount()-elapsedTime;
|
|
message(String("[GenericServer::listen]service took ")+String().fromInt(elapsedTime)+String("(ms)"));
|
|
}
|
|
mGenericControl.destroy();
|
|
message("[GenericServer::listen]terminating connection");
|
|
return TRUE;
|
|
}
|
|
|
|
// virtuals
|
|
|
|
void GenericServer::message(const String &message)
|
|
{
|
|
::OutputDebugString(message+String("\n"));
|
|
}
|
|
|
|
void GenericServer::message(Block<String> &msgData)
|
|
{
|
|
for(int msgIndex=0;msgIndex<msgData.size();msgIndex++)message(msgData[msgIndex]);
|
|
}
|
|
|
|
void GenericServer::acceptHandler(SmartPointer<Socket> &socket)
|
|
{
|
|
SmartPointer<Socket> socketControl;
|
|
|
|
socketControl=socket;
|
|
socketControl.disposition(PointerDisposition::Delete);
|
|
String acceptString("[GenericServer::acceptHandler]200 GenericServer::acceptHandler accepting connection.");
|
|
socketControl->send(acceptString);
|
|
message(acceptString);
|
|
return;
|
|
}
|
|
|