[asycxx-devel] SF.net SVN: asycxx:[32] trunk
Status: Alpha
Brought to you by:
joe_steeve
From: <joe...@us...> - 2009-04-08 07:35:08
|
Revision: 32 http://asycxx.svn.sourceforge.net/asycxx/?rev=32&view=rev Author: joe_steeve Date: 2009-04-08 07:35:06 +0000 (Wed, 08 Apr 2009) Log Message: ----------- refactored class:TCPTransport to derive from StreamTransport Since most of the I/O code is the same as the one in StreamTransport, this class only provides ways to close the transport properly From: Joe Steeve <js...@hi...> Modified Paths: -------------- trunk/include/asycxx/TCPTransport.h trunk/src/TCPTransport.cxx Modified: trunk/include/asycxx/TCPTransport.h =================================================================== --- trunk/include/asycxx/TCPTransport.h 2009-04-08 07:34:17 UTC (rev 31) +++ trunk/include/asycxx/TCPTransport.h 2009-04-08 07:35:06 UTC (rev 32) @@ -18,21 +18,23 @@ #include "Error.h" #include "Reactor.h" #include "DataBuffer.h" -#include "Transport.h" +#include "StreamTransport.h" -class TCPTransport : public Transport +namespace asycxx { -public: - TCPTransport (Reactor *reactor, int fd); - virtual ~TCPTransport (); - -protected: - Result doWrite (void); - Result doRead (DataBuffer *data); - void doDisconnect (void); - -}; + class TCPTransport : public StreamTransport + { + public: + TCPTransport (Reactor *reactor, int fd) : StreamTransport (reactor, fd) {} + virtual ~TCPTransport (); + /* methods to satisfy the 'Transport' interface */ + void Close (void); + void closeReader (void); + void closeWriter (void); + }; +} + #endif /* __HIPRO_ASYCXX__TCP_TRANSPORT_H__ */ /* Modified: trunk/src/TCPTransport.cxx =================================================================== --- trunk/src/TCPTransport.cxx 2009-04-08 07:34:17 UTC (rev 31) +++ trunk/src/TCPTransport.cxx 2009-04-08 07:35:06 UTC (rev 32) @@ -28,140 +28,59 @@ #include <asycxx/Protocol.h> #include <asycxx/TCPTransport.h> +using namespace asycxx; -TCPTransport::TCPTransport (Reactor *reactor, int fd) - : Transport (reactor, fd) + +TCPTransport::~TCPTransport () { + Close (); } -TCPTransport::~TCPTransport () +void +TCPTransport::Close (void) { + closeReader (); + closeWriter (); } -Result -TCPTransport::doRead (DataBuffer *data) +void +TCPTransport::closeReader (void) { - ASSERT ((data != NULL), "checking parameters"); - ssize_t rlen; - - __doRead__again: - rlen = read (m_Fd, data->Data(), data->BufferLen()); - if (rlen == -1) + stopReading(); // first unhook from the reactor + if (isReaderOpen()) { - if (errno == EINTR) - { - goto __doRead__again; - } - else if (errno == EAGAIN) + int ret; + ret = shutdown (Fd(), SHUT_RD); + if (ret == -1) { - data->Len(0); - return Result_Success; + ERR ("%s: shutting-down read end of TCP connection, %d", + strerror(errno), Fd()); } - else - { - ERR ("%s: reading from fd=%d", strerror(errno), m_Fd); - return Result_Error; - } + markReaderAsClosed(); } - - /* check for end-of-file */ - if (rlen == 0) - { - ERR ("EoF on fd=%d", m_Fd); - return Result_Error; - } - data->Len(rlen); - - return Result_Success; } -Result -TCPTransport::doWrite (void) +void +TCPTransport::closeWriter (void) { - ssize_t wrote; - ssize_t wlen, to_wlen; - DataBuffer *data; - void *bfr; - - wrote = 0; - while (m_writeBuffers.size() > 0) + stopWriting (); // first unhook from the reactor + if (isWriterOpen()) { - data = m_writeBuffers[0]; - to_wlen = data->Len() - data->Processed(); - bfr = data->UnProcessed (); - - wlen = write (m_Fd, bfr, to_wlen); - if (wlen == -1) + int ret; + ret = shutdown (Fd(), SHUT_WR); + if (ret == -1) { - if (errno == EINTR) { continue; } - else if (errno == EAGAIN) { return Result_Pending; } - else - { - ERR ("%s: writing DataBuffer<%p>::data<%p>,len=%d to fd=%d", - strerror (errno), data, bfr, to_wlen, m_Fd); - return Result_Error; - } + ERR ("%s: shutting-down write end of TCP connection, %d", + strerror(errno), Fd()); } - - /* update pointers */ - data->Processed((data->Processed() + wlen)); - wrote += wlen; - - if (data->Processed() == data->Len()) - { - m_writeBuffers.pop_front(); - data->DisOwn(); - } + markWriterAsClosed(); } - - return Result_Success; } -void -TCPTransport::doDisconnect (void) -{ - int ret; - ret = shutdown (m_Fd, SHUT_RDWR); - if (ret == -1) - { - ERR ("%s: shutting down connection", strerror(errno)); - } - -} - -// Result -// TCPTransport::configureTCPNoDelay (void) -// { -// /** \todo using setsockopt should configure TCP_NODELAY. This disables -// nagle's algorithm and increase small packets on the network. */ -// ASSERT ((m_Fd != -1), "sanity checks"); - -// int iret; -// int optval = 1; -// iret = setsockopt (m_Fd, IPPROTO_TCP, TCP_NODELAY, (void *)&optval, -// sizeof (optval)); -// if (iret != 0) -// { - -// } -// } - - -// Result -// TCPTransport::configureTCPKeelAlive (int idle_time, int probe_count, -// int probe_interval) -// { -// /** \todo using setsockopt should configure TCP_KEEPCNT */ - -// /** \todo using setsockopt should configure TCP_KEEPIDLE */ - -// /** \todo using setsockopt should configure TCP_KEEPINTVL */ -// } - /* Local Variables: mode: c++ This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |