/*************************************************************************
* UrBackup - Client/Server backup system
* Copyright (C) 2011 Martin Raiber
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see .
**************************************************************************/
#include "vld.h"
#ifdef _WIN32
#include
#endif
#include "ServiceAcceptor.h"
#include "Server.h"
#include "stringtools.h"
#include "ServiceWorker.h"
#include
#include "Interface/Mutex.h"
#include "Interface/Condition.h"
CServiceAcceptor::CServiceAcceptor(IService * pService, std::string pName, unsigned short port)
{
name=pName;
service=pService;
exitpipe=Server->createMemoryPipe();
do_exit=false;
int rc;
#ifdef _WIN32
WSADATA wsadata;
rc = WSAStartup(MAKEWORD(2,0), &wsadata);
if(rc == SOCKET_ERROR) return;
#endif
s=socket(AF_INET,SOCK_STREAM,0);
if(s<1)
{
Server->Log(name+": Creating SOCKET failed",LL_ERROR);
return;
}
sockaddr_in addr;
memset(&addr, 0, sizeof(sockaddr_in));
addr.sin_family=AF_INET;
addr.sin_port=htons(port);
addr.sin_addr.s_addr=INADDR_ANY;
rc=bind(s,(sockaddr*)&addr,sizeof(addr));
if(rc==SOCKET_ERROR)
{
Server->Log(name+": Failed binding SOCKET to Port "+nconvert(port),LL_ERROR);
return;
}
listen(s, 10000);
Server->Log(name+": Server started up sucessfully!",LL_INFO);
}
CServiceAcceptor::~CServiceAcceptor()
{
do_exit=true;
closesocket(s);
for(size_t i=0;istop();
}
size_t c=0;
while(cRead(&r);
if(r=="ok")
++c;
}
Server->destroy(exitpipe);
for(size_t i=0;i0)
{
Server->Log(name+": New Connection incomming "+nconvert(Server->getTimeMS())+" s: "+nconvert((int)ns), LL_DEBUG);
#ifdef _WIN32
int window_size=512*1024;
setsockopt(ns, SOL_SOCKET, SO_SNDBUF, (char *) &window_size, sizeof(window_size));
setsockopt(ns, SOL_SOCKET, SO_RCVBUF, (char *) &window_size, sizeof(window_size));
#endif
AddToWorker(ns);
}
}
}
exitpipe->Write("ok");
}
void CServiceAcceptor::AddToWorker(SOCKET pSocket)
{
for(size_t i=0;igetAvailableSlots()>0 )
{
workers[i]->AddClient(pSocket);
return;
}
}
Server->Log(name+": No available slots... starting new Worker", LL_DEBUG);
CServiceWorker *nw=new CServiceWorker(service, name, exitpipe);
workers.push_back(nw);
Server->createThread(nw);
nw->AddClient( pSocket );
}