/************************************************************************* * 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 ); }