summaryrefslogtreecommitdiff
path: root/cppe/src/TcpTransport/Acceptor.cpp
diff options
context:
space:
mode:
authorDwayne Boone <dwayne@zeroc.com>2005-06-20 16:43:38 +0000
committerDwayne Boone <dwayne@zeroc.com>2005-06-20 16:43:38 +0000
commit8b0d67e9ad16a3b6bdfff6d9900ea009442249a0 (patch)
treed1cfce0274d58c377392d56f64d57b10d8a1c8fb /cppe/src/TcpTransport/Acceptor.cpp
parentImproved fix for bug #377 (diff)
downloadice-8b0d67e9ad16a3b6bdfff6d9900ea009442249a0.tar.bz2
ice-8b0d67e9ad16a3b6bdfff6d9900ea009442249a0.tar.xz
ice-8b0d67e9ad16a3b6bdfff6d9900ea009442249a0.zip
Separated TCP into separate transport library
Diffstat (limited to 'cppe/src/TcpTransport/Acceptor.cpp')
-rw-r--r--cppe/src/TcpTransport/Acceptor.cpp142
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);
+}