Files
Work/CapServer/gensrv.cpp
2024-08-07 09:12:07 -04:00

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