diff options
Diffstat (limited to 'cppe/src/TcpTransport/Acceptor.cpp')
-rw-r--r-- | cppe/src/TcpTransport/Acceptor.cpp | 142 |
1 files changed, 142 insertions, 0 deletions
diff --git a/cppe/src/TcpTransport/Acceptor.cpp b/cppe/src/TcpTransport/Acceptor.cpp new file mode 100644 index 00000000000..14725d5f774 --- /dev/null +++ b/cppe/src/TcpTransport/Acceptor.cpp @@ -0,0 +1,142 @@ +// ********************************************************************** +// +// Copyright (c) 2003-2005 ZeroC, Inc. All rights reserved. +// +// This copy of Ice is licensed to you under the terms described in the +// ICE_LICENSE file included in this distribution. +// +// ********************************************************************** + +#include <Ice/Acceptor.h> +#include <Ice/Transceiver.h> +#include <Ice/Instance.h> +#include <Ice/TraceLevels.h> +#include <Ice/LoggerUtil.h> +#include <Ice/Network.h> +#include <Ice/Exception.h> + +using namespace std; +using namespace Ice; +using namespace IceInternal; + +void IceInternal::incRef(Acceptor* p) { p->__incRef(); } +void IceInternal::decRef(Acceptor* p) { p->__decRef(); } + +SOCKET +IceInternal::Acceptor::fd() +{ + return _fd; +} + +void +IceInternal::Acceptor::close() +{ + if(_traceLevels->network >= 1) + { + Trace out(_logger, _traceLevels->networkCat); + out << "stopping to accept tcp connections at " << toString(); + } + + SOCKET fd = _fd; + _fd = INVALID_SOCKET; + closeSocket(fd); +} + +void +IceInternal::Acceptor::listen() +{ + try + { + doListen(_fd, _backlog); + } + catch(...) + { + _fd = INVALID_SOCKET; + throw; + } + + if(_traceLevels->network >= 1) + { + Trace out(_logger, _traceLevels->networkCat); + out << "accepting tcp connections at " << toString(); + } +} + +TransceiverPtr +IceInternal::Acceptor::accept(int timeout) +{ + SOCKET fd = doAccept(_fd, timeout); + setBlock(fd, false); + + if(_traceLevels->network >= 1) + { + Trace out(_logger, _traceLevels->networkCat); + out << "accepted tcp connection\n" << fdToString(fd); + } + + return new Transceiver(_instance, fd); +} + +void +IceInternal::Acceptor::connectToSelf() +{ + SOCKET fd = createSocket(); + setBlock(fd, false); + doConnect(fd, _addr, -1); + closeSocket(fd); +} + +string +IceInternal::Acceptor::toString() const +{ + return addrToString(_addr); +} + +bool +IceInternal::Acceptor::equivalent(const string& host, int port) const +{ + struct sockaddr_in addr; + getAddress(host, port, addr); + return compareAddress(addr, _addr); +} + +int +IceInternal::Acceptor::effectivePort() +{ + return ntohs(_addr.sin_port); +} + +IceInternal::Acceptor::Acceptor(const InstancePtr& instance, const string& host, int port) : + _instance(instance), + _traceLevels(instance->traceLevels()), + _logger(instance->logger()), + _backlog(0) +{ + if(_backlog <= 0) + { + _backlog = 5; + } + + try + { + _fd = createSocket(); + setBlock(_fd, false); + getAddress(host, port, _addr); + if(_traceLevels->network >= 2) + { + Trace out(_logger, _traceLevels->networkCat); + out << "attempting to bind to tcp socket " << toString(); + } + doBind(_fd, _addr); + } + catch(...) + { + _fd = INVALID_SOCKET; + throw; + } +} + +IceInternal::Acceptor::~Acceptor() +{ + assert(_fd == INVALID_SOCKET); +} |