// ********************************************************************** // // Copyright (c) 2003-2007 ZeroC, Inc. All rights reserved. // // This copy of Ice-E is licensed to you under the terms described in the // ICEE_LICENSE file included in this distribution. // // ********************************************************************** #include #include #include #include #include #include #include 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() { SOCKET fd = doAccept(_fd); #ifndef ICEE_USE_SELECT_FOR_TIMEOUTS setBlock(fd, true); #endif 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); } 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->initializationData().logger), _backlog(0) { if(_backlog <= 0) { _backlog = 5; } try { _fd = createSocket(); 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); }