Public Member Functions | Friends

ACE_DEV_IO Class Reference

Read/Write operations on Devices. More...

#include <DEV_IO.h>

Inheritance diagram for ACE_DEV_IO:
Inheritance graph
[legend]
Collaboration diagram for ACE_DEV_IO:
Collaboration graph
[legend]

List of all members.

Public Member Functions

 ACE_DEV_IO (void)
 Default constructor.
ssize_t send (const void *buf, size_t n) const
 send upto n bytes in buf.
ssize_t recv (void *buf, size_t n) const
 Recv upto n bytes in buf.
ssize_t send_n (const void *buf, size_t n) const
 Send n bytes, keep trying until n are sent.

Friends

class ACE_DEV_Connector

I/O operations

Notes on common parameters:

buf is the buffer to write from or receive into.

len is the number of bytes to transfer.

The timeout parameter in the following methods indicates how long to blocking trying to transfer data. If timeout == 0, then the call behaves as a normal send/recv call, i.e., for blocking sockets, the call will block until action is possible; for non-blocking sockets, EWOULDBLOCK will be returned if no action is immediately possible.

If timeout != 0, the call will wait until the relative time specified in *timeout elapses.

The "_n()" I/O methods keep looping until all the data has been transferred. These methods also work for sockets in non-blocking mode i.e., they keep looping on EWOULDBLOCK. timeout is used to make sure we keep making progress, i.e., the same timeout value is used for every I/O operation in the loop and the timeout is not counted down.

The return values for the "*_n()" methods match the return values from the non "_n()" methods and are specified as follows:

  • On complete transfer, the number of bytes transferred is returned.
  • On timeout, -1 is returned, errno == ETIME.
  • On error, -1 is returned, errno is set to appropriate error.
  • On EOF, 0 is returned, errno is irrelevant.

On partial transfers, i.e., if any data is transferred before timeout/error/EOF, bytes_transferred will contain the number of bytes transferred.



typedef ACE_DEV_Addr PEER_ADDR
 Declare the dynamic allocation hooks.
 ACE_ALLOC_HOOK_DECLARE
 Declare the dynamic allocation hooks.
ACE_DEV_Addr addr_
 Address of device we are connected to.
ssize_t recv_n (void *buf, size_t n, const ACE_Time_Value *timeout=0, size_t *bytes_transferred=0) const
 Declare the dynamic allocation hooks.
ssize_t send (const iovec iov[], size_t n) const
 Send iovecs via <writev>.
ssize_t recv (iovec iov[], size_t n) const
 Recv iovecs via <readv>.
ssize_t send (size_t n,...) const
ssize_t recv (size_t n,...) const
ssize_t send (const void *buf, size_t n, ACE_OVERLAPPED *overlapped) const
 Send n bytes via Win32 WriteFile using overlapped I/O.
ssize_t recv (void *buf, size_t n, ACE_OVERLAPPED *overlapped) const
 Recv n bytes via Win32 ReadFile using overlapped I/O.
void dump (void) const
 Dump the state of an object.
int get_local_addr (ACE_DEV_Addr &) const
 Return the local endpoint address.
int get_remote_addr (ACE_DEV_Addr &) const

Detailed Description

Read/Write operations on Devices.

Definition at line 40 of file DEV_IO.h.


Member Typedef Documentation

Declare the dynamic allocation hooks.

Definition at line 171 of file DEV_IO.h.


Constructor & Destructor Documentation

ACE_DEV_IO::ACE_DEV_IO ( void   ) 

Default constructor.

Definition at line 53 of file DEV_IO.cpp.

{
  ACE_TRACE ("ACE_DEV_IO::ACE_DEV_IO");
}


Member Function Documentation

void ACE_DEV_IO::dump ( void   )  const

Dump the state of an object.

Reimplemented from ACE_DEV.

Definition at line 40 of file DEV_IO.cpp.

{
#if defined (ACE_HAS_DUMP)
  ACE_TRACE ("ACE_DEV_IO::dump");

  ACE_DEBUG ((LM_DEBUG, ACE_BEGIN_DUMP, this));
  this->addr_.dump ();
  ACE_DEBUG ((LM_DEBUG, ACE_END_DUMP));
#endif /* ACE_HAS_DUMP */
}

int ACE_DEV_IO::get_local_addr ( ACE_DEV_Addr addr  )  const

Return the local endpoint address.

Definition at line 20 of file DEV_IO.cpp.

{
  ACE_TRACE ("ACE_DEV_IO::get_local_addr");

  addr = this->addr_;
  return 0;
}

int ACE_DEV_IO::get_remote_addr ( ACE_DEV_Addr addr  )  const

Return the address of the remotely connected peer (if there is one).

Definition at line 32 of file DEV_IO.cpp.

{
  ACE_TRACE ("ACE_DEV_IO::get_remote_addr");
  addr = this->addr_;
  return 0;
}

ssize_t ACE_DEV_IO::recv ( void *  buf,
size_t  n,
ACE_OVERLAPPED overlapped 
) const [inline]

Recv n bytes via Win32 ReadFile using overlapped I/O.

Definition at line 88 of file DEV_IO.inl.

{
  ACE_TRACE ("ACE_DEV_IO::recv");
  return ACE_OS::read (this->get_handle (), (char *) buf, n,
                       overlapped);
}

ssize_t ACE_DEV_IO::recv ( void *  buf,
size_t  n 
) const [inline]

Recv upto n bytes in buf.

Definition at line 57 of file DEV_IO.inl.

{
  ACE_TRACE ("ACE_DEV_IO::recv");
  return ACE_OS::read (this->get_handle (), (char *) buf, n);
}

ssize_t ACE_DEV_IO::recv ( size_t  n,
  ... 
) const

This is an interface to readv, that doesn't use the struct iovec explicitly. The ... can be passed as an arbitrary number of (char *ptr, int len) tuples. However, the count N is the *total* number of trailing arguments, *not* a couple of the number of tuple pairs!

Definition at line 101 of file DEV_IO.cpp.

{
  ACE_TRACE ("ACE_DEV_IO::recv");
  va_list argp;
  int total_tuples = static_cast<int> (n / 2);
  iovec *iovp;
#if defined (ACE_HAS_ALLOCA)
  iovp = (iovec *) alloca (total_tuples * sizeof (iovec));
#else
  ACE_NEW_RETURN (iovp,
                  iovec[total_tuples],
                  -1);
#endif /* !defined (ACE_HAS_ALLOCA) */

  va_start (argp, n);

  for (int i = 0; i < total_tuples; i++)
    {
      iovp[i].iov_base = va_arg (argp, char *);
      iovp[i].iov_len  = va_arg (argp, int);
    }

  ssize_t result = ACE_OS::readv (this->get_handle (), iovp, total_tuples);
#if !defined (ACE_HAS_ALLOCA)
  delete [] iovp;
#endif /* !defined (ACE_HAS_ALLOCA) */
  va_end (argp);
  return result;
}

ssize_t ACE_DEV_IO::recv ( iovec  iov[],
size_t  n 
) const [inline]

Recv iovecs via <readv>.

Definition at line 71 of file DEV_IO.inl.

{
  ACE_TRACE ("ACE_DEV_IO::recv");
  return ACE_OS::readv (this->get_handle (), iov, static_cast<int> (n));
}

ssize_t ACE_DEV_IO::recv_n ( void *  buf,
size_t  n,
const ACE_Time_Value timeout = 0,
size_t *  bytes_transferred = 0 
) const [inline]

Declare the dynamic allocation hooks.

Definition at line 27 of file DEV_IO.inl.

{
  ACE_TRACE ("ACE_DEV_IO::recv_n");
#if defined (ACE_WIN32)
  ACE_UNUSED_ARG (timeout);

  return ACE::read_n (this->get_handle (),
                      buf,
                      n,
                      bytes_transferred);
#else
  return ACE::recv_n (this->get_handle (),
                      buf,
                      n,
                      timeout,
                      bytes_transferred);
#endif /*ACE_WIN32*/
}

ssize_t ACE_DEV_IO::send ( size_t  n,
  ... 
) const

Send N char *ptrs and int lengths. Note that the char *'s precede the ints (basically, an varargs version of writev). The count N is the *total* number of trailing arguments, *not* a couple of the number of tuple pairs!

Definition at line 64 of file DEV_IO.cpp.

{
  ACE_TRACE ("ACE_DEV_IO::send");
  va_list argp;
  int total_tuples = static_cast<int> (n / 2);
  iovec *iovp;
#if defined (ACE_HAS_ALLOCA)
  iovp = (iovec *) alloca (total_tuples * sizeof (iovec));
#else
  ACE_NEW_RETURN (iovp,
                  iovec[total_tuples],
                  -1);
#endif /* !defined (ACE_HAS_ALLOCA) */

  va_start (argp, n);

  for (int i = 0; i < total_tuples; i++)
    {
      iovp[i].iov_base = va_arg (argp, char *);
      iovp[i].iov_len  = va_arg (argp, int);
    }

  ssize_t result = ACE_OS::writev (this->get_handle (), iovp, total_tuples);
#if !defined (ACE_HAS_ALLOCA)
  delete [] iovp;
#endif /* !defined (ACE_HAS_ALLOCA) */
  va_end (argp);
  return result;
}

ssize_t ACE_DEV_IO::send ( const iovec  iov[],
size_t  n 
) const [inline]

Send iovecs via <writev>.

Definition at line 64 of file DEV_IO.inl.

{
  ACE_TRACE ("ACE_DEV_IO::send");
  return ACE_OS::writev (this->get_handle (), iov, static_cast<int> (n));
}

ssize_t ACE_DEV_IO::send ( const void *  buf,
size_t  n,
ACE_OVERLAPPED overlapped 
) const [inline]

Send n bytes via Win32 WriteFile using overlapped I/O.

Definition at line 78 of file DEV_IO.inl.

{
  ACE_TRACE ("ACE_DEV_IO::send");
  return ACE_OS::write (this->get_handle (),
                        (const char *) buf, n,
                        overlapped);
}

ssize_t ACE_DEV_IO::send ( const void *  buf,
size_t  n 
) const [inline]

send upto n bytes in buf.

Definition at line 50 of file DEV_IO.inl.

{
  ACE_TRACE ("ACE_DEV_IO::send");
  return ACE_OS::write (this->get_handle (), (const char *) buf, n);
}

ssize_t ACE_DEV_IO::send_n ( const void *  buf,
size_t  n 
) const [inline]

Send n bytes, keep trying until n are sent.

Definition at line 17 of file DEV_IO.inl.

{
  ACE_TRACE ("ACE_DEV_IO::send_n");
  return ACE::write_n (this->get_handle (), buf, n);
}


Friends And Related Function Documentation

friend class ACE_DEV_Connector [friend]

Definition at line 43 of file DEV_IO.h.


Member Data Documentation

Declare the dynamic allocation hooks.

Reimplemented from ACE_DEV.

Definition at line 168 of file DEV_IO.h.

Address of device we are connected to.

Definition at line 175 of file DEV_IO.h.


The documentation for this class was generated from the following files:
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Defines