From ea9fe3ef923000a7bfa4d7afc306669d5442e0fc Mon Sep 17 00:00:00 2001 From: Matthias Schiffer Date: Thu, 26 Jun 2008 16:39:25 +0200 Subject: ConnectionManager f?r den Kern hinzugef?gt --- src/Net/Connection.cpp | 6 ++++++ src/Net/Connection.h | 5 ++++- src/Net/Listener.cpp | 19 +++++++++++++++++++ src/Net/Listener.h | 4 ++++ 4 files changed, 33 insertions(+), 1 deletion(-) (limited to 'src/Net') diff --git a/src/Net/Connection.cpp b/src/Net/Connection.cpp index e7be313..4e3fee4 100644 --- a/src/Net/Connection.cpp +++ b/src/Net/Connection.cpp @@ -168,5 +168,11 @@ void Connection::disconnect() { state = DISCONNECTED; } +struct pollfd Connection::getPollfd() const { + struct pollfd fd = {sock, (receiveComplete() ? 0 : POLLIN) | (sendQueueEmpty() ? 0 : POLLOUT), 0}; + + return fd; +} + } } diff --git a/src/Net/Connection.h b/src/Net/Connection.h index 0ef3ebf..0880036 100644 --- a/src/Net/Connection.h +++ b/src/Net/Connection.h @@ -23,6 +23,7 @@ #include #include #include +#include #include "Packet.h" namespace Mad { @@ -125,6 +126,8 @@ class Connection { void disconnect(); + struct pollfd getPollfd() const; + bool send(const Packet &packet) { if(!isConnected() || isConnecting()) return false; @@ -142,7 +145,7 @@ class Connection { doSend(); } - bool sendQueueEmpty() {return transS.empty();} + bool sendQueueEmpty() const {return transS.empty();} sigc::signal signalReceive() const {return signal;} diff --git a/src/Net/Listener.cpp b/src/Net/Listener.cpp index 3fb2415..8386389 100644 --- a/src/Net/Listener.cpp +++ b/src/Net/Listener.cpp @@ -67,13 +67,32 @@ Listener::Listener(const IPAddress &address0) throw(ConnectionException) } Listener::~Listener() { + for(std::list::iterator con = connections.begin(); con != connections.end(); ++con) { + (*con)->disconnect(); + delete *con; + } + shutdown(sock, SHUT_RDWR); close(sock); gnutls_dh_params_deinit(dh_params); } +std::vector Listener::getPollfds() const { + std::vector pollfds; + + struct pollfd fd = {sock, POLLIN, 0}; + pollfds.push_back(fd); + + for(std::list::const_iterator con = connections.begin(); con != connections.end(); ++con) + pollfds.push_back((*con)->getPollfd()); + + return pollfds; +} + ServerConnection* Listener::getConnection() { + // TODO: Logging + int sd; struct sockaddr_in sa; socklen_t addrlen = sizeof(sa); diff --git a/src/Net/Listener.h b/src/Net/Listener.h index 5c59a6e..9952268 100644 --- a/src/Net/Listener.h +++ b/src/Net/Listener.h @@ -23,7 +23,9 @@ #include "IPAddress.h" #include "ConnectionException.h" #include +#include #include +#include namespace Mad { namespace Net { @@ -47,6 +49,8 @@ class Listener { Listener(const IPAddress &address0) throw(ConnectionException); virtual ~Listener(); + std::vector getPollfds() const; + ServerConnection* getConnection(); }; -- cgit v1.2.3