Files
Work/proto/source/gensrv.cpp
2024-08-07 09:16:27 -04:00

161 lines
5.5 KiB
C++

#include <proto/gensrv.hpp>
#include <common/string.hpp>
GenericServer::GenericServer(void)
: mIsRunning(TRUE)
{
}
GenericServer::~GenericServer()
{
message("Server is destructing...");
}
void GenericServer::close(void)
{
mIsRunning=FALSE;
}
WORD GenericServer::send(const char &charData)
{
return mPortControl.send(charData);
}
WORD GenericServer::send(const String &sendString)
{
return mPortControl.send(sendString);
}
WORD GenericServer::receive(String &receiveString,BOOL waitForData)
{
return mPortControl.receive(receiveString,waitForData);
}
WORD GenericServer::receive(char &charData,BOOL waitForData)
{
return mPortControl.receive(charData,waitForData);
}
WORD GenericServer::receive(Block<String> &receiveStrings)
{
return mPortControl.receive(receiveStrings);
}
/*
WORD GenericServer::listen(const String &hostName,short portNum)
{
HostEnt hostEntry;
ServEnt serverEntry;
String stringData;
message(String("trying host'")+hostName+String("'..."));
if(!mWSASystem.isInitialized()){message("WINSOCK initialization failure.");return FALSE;}
InternetAddress internetAddress(hostName);
if(!internetAddress.isZero()){if(!hostEntry.hostByAddress(internetAddress)){message(String("no DNS entry for ")+hostName);return FALSE;}}
else if(!hostEntry.hostByName(hostName)){message(String("no DNS entry for ")+hostName);return FALSE;}
message(String("connect...")+String("'")+hostEntry.hostName()+String("' (")+(String)(hostEntry.addresses())[0]+String(")"));
mInternetSocketAddress.internetAddress((hostEntry.addresses())[0]);
mInternetSocketAddress.family(PF_INET);
mInternetSocketAddress.port(portNum);
while(TRUE)
{
INETSocketAddress internetSocketAddress;
message(String("[GenericServer::listen] host='")+(hostEntry.addresses())[0]+String("' port=")+String().fromInt(portNum));
if(!mGenericControl.create()){message("socket initialization failure.");return FALSE;}
if(!mGenericControl.bind(mInternetSocketAddress)){message("bind failed");return FALSE;}
String strLocalHost((String)mInternetSocketAddress.internetAddress());
message(String("local address is ")+strLocalHost);
if(!mGenericControl.listen()){message("listen failed");return FALSE;}
message("waiting for connection...");
if(!mGenericControl.accept(mPortControl,internetSocketAddress)){message("accept returned FALSE;");return FALSE;}
message(String("service started from ")+(String)internetSocketAddress.internetAddress());
mPortControl.bind(internetSocketAddress);
acceptHandler();
if(mPortControl.receive(stringData))stringHandler(stringData);
mPortControl.destroy();
mGenericControl.destroy();
::Sleep(TimeOut);
}
message("terminating connection");
return TRUE;
}
*/
WORD GenericServer::listen(const String &hostName,short portNum)
{
HostEnt hostEntry;
ServEnt serverEntry;
String stringData;
message(String("trying host'")+hostName+String("'..."));
if(!mWSASystem.isInitialized()){message("WINSOCK initialization failure.");return FALSE;}
InternetAddress internetAddress(hostName);
if(!internetAddress.isZero()){if(!hostEntry.hostByAddress(internetAddress)){message(String("no DNS entry for ")+hostName);return FALSE;}}
else if(!hostEntry.hostByName(hostName)){message(String("no DNS entry for ")+hostName);return FALSE;}
message(String("connect...")+String("'")+hostEntry.hostName()+String("' (")+(String)(hostEntry.addresses())[0]+String(")"));
mInternetSocketAddress.internetAddress((hostEntry.addresses())[0]);
mInternetSocketAddress.family(PF_INET);
mInternetSocketAddress.port(portNum);
while(TRUE)
{
INETSocketAddress internetSocketAddress;
message(String("[GenericServer::listen] host='")+(hostEntry.addresses())[0]+String("' port=")+String().fromInt(portNum));
if(!mGenericControl.create()){message("socket initialization failure.");return FALSE;}
mGenericControl.reuseAddress();
if(!mGenericControl.bind(mInternetSocketAddress)){message("bind failed");return FALSE;}
String strLocalHost((String)mInternetSocketAddress.internetAddress());
message(String("local address is ")+strLocalHost);
if(!mGenericControl.listen()){message("listen failed");return FALSE;}
message("waiting for connection...");
if(!mGenericControl.accept(mPortControl,internetSocketAddress)){message("accept returned FALSE;");return FALSE;}
message(String("service started from ")+internetSocketAddress.internetAddress().toString());
mPortControl.bind(internetSocketAddress);
acceptHandler();
// if(mPortControl.receive(stringData))stringHandler(stringData);
Block<String> receiveStrings;
printf("Received data...");
if(mPortControl.receive(receiveStrings))
{
for(int index=0;index<receiveStrings.size();index++)
{
printf("%s\n",receiveStrings[index].str());
}
}
mPortControl.destroy();
mGenericControl.destroy();
::Sleep(TimeOut);
}
message("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(void)
{
String acceptString("200 GenericServer::acceptHandler accepting connection.");
mPortControl.send(acceptString);
message(acceptString);
return;
}
BOOL GenericServer::stringHandler(const String &stringData)
{
String stringString("200 GenericServer::stringHandler received your data.");
mPortControl.send(stringString);
message(stringString);
message(stringData);
if(stringData==String("QUIT"))return FALSE;
return TRUE;
}