[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.
|