22 #include "BuiltInObjectTypeIDs.h"
26 #include <netinet/in.h>
31 #include <sys/socket.h>
33 #include <sys/socket.h>
34 #include <sys/types.h>
58 memset(&sa,
'\0',
sizeof(sa));
59 sa.sa_handler = SIG_IGN;
60 sigaction(SIGPIPE, &sa, 0);
74 memset(&sa,
'\0',
sizeof(sa));
75 sa.sa_handler = SIG_IGN;
76 sigaction(SIGPIPE, &sa, 0);
101 sockFD = socket(AF_INET, SOCK_STREAM, 0);
105 if (setsockopt(
sockFD, SOL_SOCKET, SO_REUSEADDR, &optval,
sizeof(optval)) < 0) {
106 myLogger->error(
"PDBServer: couldn't setsockopt");
108 std::cout <<
"PDBServer: couldn't setsockopt:" << strerror(errno) << std::endl;
115 myLogger->error(
"PDBServer: could not get FD to internet socket");
122 struct sockaddr_in serv_addr;
123 bzero((
char*)&serv_addr,
sizeof(serv_addr));
124 serv_addr.sin_family = AF_INET;
125 serv_addr.sin_addr.s_addr = INADDR_ANY;
127 int retVal = ::bind(
sockFD, (
struct sockaddr*)&serv_addr,
sizeof(serv_addr));
129 myLogger->error(
"PDBServer: could not bind to internet socket");
135 myLogger->trace(
"PDBServer: about to listen to the Internet for a connection");
139 myLogger->error(
"PDBServer: listen error");
145 myLogger->trace(
"PDBServer: ready to go!");
151 myLogger->error(
"PDBServer: could not point to an internet socket: " + errMsg);
154 myLogger->info(std::string(
"accepted the connection with sockFD=") +
155 std::to_string(myCommunicator->getSocketFD()));
156 PDB_COUT <<
"||||||||||||||||||||||||||||||||||" << std::endl;
157 PDB_COUT <<
"accepted the connection with sockFD=" << myCommunicator->getSocketFD()
165 myLogger->trace(
"PDBServer: getting socket to file");
166 sockFD = socket(PF_UNIX, SOCK_STREAM, 0);
169 myLogger->error(
"PDBServer: could not get FD to local socket");
175 struct sockaddr_un serv_addr;
176 bzero((
char*)&serv_addr,
sizeof(serv_addr));
177 serv_addr.sun_family = AF_UNIX;
178 snprintf(serv_addr.sun_path,
sizeof(serv_addr.sun_path),
"%s",
unixFile.c_str());
180 if (::bind(
sockFD, (
struct sockaddr*)&serv_addr,
sizeof(
struct sockaddr_un))) {
181 myLogger->error(
"PDBServer: could not bind to local socket");
184 if (unlink(
unixFile.c_str()) == 0) {
187 if (::bind(
sockFD, (
struct sockaddr*)&serv_addr,
sizeof(
struct sockaddr_un))) {
189 "PDBServer: still could not bind to local socket after removing unixFile");
195 myLogger->debug(
"PDBServer: socket has name");
196 myLogger->debug(serv_addr.sun_path);
198 myLogger->trace(
"PDBServer: about to listen to the file for a connection");
202 myLogger->error(
"PDBServer: listen error");
207 myLogger->trace(
"PDBServer: ready to go!");
212 myCommunicator = make_shared<PDBCommunicator>();
214 myLogger->error(
"PDBServer: could not point to an local UNIX socket: " + errMsg);
217 PDB_COUT <<
"||||||||||||||||||||||||||||||||||" << std::endl;
218 PDB_COUT <<
"accepted the connection with sockFD=" << myCommunicator->getSocketFD()
240 tempWork->setGuts(myCommunicator);
242 tempWorker->execute(tempWork, tempWork->getLinkedBuzzer());
249 int16_t requestID = myCommunicator->getObjectTypeID();
254 if (requestID == CloseConnection_TYPEID) {
259 myLogger->error(
"PDBServer: close connection request, but was an error: " + info);
261 myLogger->trace(
"PDBServer: close connection request");
266 if (requestID == NoMsg_TYPEID) {
268 myLogger->trace(
"PDBServer: the other side closed the connection");
273 if (requestID == ShutDown_TYPEID) {
277 myLogger->error(
"PDBServer: close connection request, but was an error: " + info);
279 myLogger->trace(
"PDBServer: close connection request");
281 PDB_COUT <<
"Cleanup server functionalities" << std::endl;
291 makeObject<SimpleRequestResult>(
true,
"successful shutdown of server");
292 if (!myCommunicator->sendObject(result, errMsg)) {
293 myLogger->error(
"PDBServer: close connection request, but count not send response: " +
306 if (
handlers.count(requestID) == 0) {
309 myLogger->error(
"PDBServer: could not find an appropriate handler");
330 myLogger->trace(
"PDBServer: got a worker, start to do something...");
331 myLogger->trace(
"PDBServer: requestID " + std::to_string(requestID));
335 myLogger->trace(
"PDBServer: setting guts");
336 tempWork->setGuts(myCommunicator);
337 tempWorker->execute(tempWork, callerBuzzer);
338 callerBuzzer->wait();
339 myLogger->trace(
"PDBServer: handler has completed its work");
345 myWorkers->notifyAllWorkers(signalWithMe);
354 if (runMeAtStart !=
nullptr) {
355 PDBBuzzerPtr buzzMeWhenDone = runMeAtStart->getLinkedBuzzer();
357 tempWorker->execute(runMeAtStart, buzzMeWhenDone);
358 buzzMeWhenDone->wait();
364 myLogger->error(
"ERROR; return code from pthread_create () is " + to_string(return_code));
map< int16_t, PDBCommWorkPtr > handlers
void startServer(PDBWorkPtr runMeAtStart)
shared_ptr< PDBWork > PDBWorkPtr
shared_ptr< ServerWork > ServerWorkPtr
PDBWorkerQueuePtr getWorkerQueue()
void signal(PDBAlarm signalWithMe)
std::shared_ptr< PDBCommunicator > PDBCommunicatorPtr
void * callListen(void *serverInstance)
bool handleOneRequest(PDBBuzzerPtr buzzMeWhenDone, PDBCommunicatorPtr myCommunicator)
PDBServer(int portNumberIn, int numConnections, PDBLoggerPtr myLogger)
shared_ptr< PDBBuzzer > PDBBuzzerPtr
shared_ptr< PDBWorkerQueue > PDBWorkerQueuePtr
shared_ptr< PDBWorker > PDBWorkerPtr
void registerHandler(int16_t typeID, PDBCommWorkPtr handledBy)
void handleRequest(PDBCommunicatorPtr myCommunicator)
std::vector< shared_ptr< ServerFunctionality > > allFunctionalities
std::shared_ptr< PDBCommWork > PDBCommWorkPtr
std::shared_ptr< PDBLogger > PDBLoggerPtr
PDBWorkerQueuePtr myWorkers
void registerHandlersFromLastFunctionality()