Go to the documentation of this file.00001
00002
00003 #include "ace/SOCK_IO.h"
00004
00005 #include "ace/Handle_Set.h"
00006 #include "ace/OS_NS_sys_select.h"
00007 #include "ace/OS_NS_sys_socket.h"
00008 #include "ace/OS_Memory.h"
00009 #include "ace/Truncate.h"
00010
00011 #if !defined (__ACE_INLINE__)
00012 #include "ace/SOCK_IO.inl"
00013 #endif
00014
00015 ACE_RCSID(ace, SOCK_IO, "$Id: SOCK_IO.cpp 84213 2009-01-22 15:45:13Z johnnyw $")
00016
00017 ACE_BEGIN_VERSIONED_NAMESPACE_DECL
00018
00019 ACE_ALLOC_HOOK_DEFINE(ACE_SOCK_IO)
00020
00021 void
00022 ACE_SOCK_IO::dump (void) const
00023 {
00024 #if defined (ACE_HAS_DUMP)
00025 ACE_TRACE ("ACE_SOCK_IO::dump");
00026 #endif
00027 }
00028
00029
00030
00031
00032
00033
00034 ssize_t
00035 ACE_SOCK_IO::recvv (iovec *io_vec,
00036 const ACE_Time_Value *timeout) const
00037 {
00038 ACE_TRACE ("ACE_SOCK_IO::recvv");
00039 #if defined (FIONREAD)
00040 ACE_Handle_Set handle_set;
00041 handle_set.reset ();
00042 handle_set.set_bit (this->get_handle ());
00043
00044 io_vec->iov_base = 0;
00045
00046
00047 # if defined (ACE_WIN32)
00048
00049
00050 int select_width = 0;
00051 # else
00052 int select_width = int (this->get_handle ()) + 1;
00053 # endif
00054 switch (ACE_OS::select (select_width,
00055 handle_set,
00056 0, 0,
00057 timeout))
00058 {
00059 case -1:
00060 return -1;
00061
00062 case 0:
00063 errno = ETIME;
00064 return -1;
00065
00066 default:
00067
00068 break;
00069 }
00070
00071 int inlen = 0;
00072
00073 if (ACE_OS::ioctl (this->get_handle (),
00074 FIONREAD,
00075 &inlen) == -1)
00076 return -1;
00077 else if (inlen > 0)
00078 {
00079 ACE_NEW_RETURN (io_vec->iov_base,
00080 char[inlen],
00081 -1);
00082
00083
00084
00085 ssize_t recv_len = this->recv (io_vec->iov_base, inlen);
00086 if (recv_len > 0)
00087
00088
00089 io_vec->iov_len = static_cast<u_long> (recv_len);
00090 return recv_len;
00091 }
00092 else
00093 return 0;
00094 #else
00095 ACE_UNUSED_ARG (io_vec);
00096 ACE_UNUSED_ARG (timeout);
00097 ACE_NOTSUP_RETURN (-1);
00098 #endif
00099 }
00100
00101
00102
00103
00104
00105
00106 ssize_t
00107 ACE_SOCK_IO::send (size_t n, ...) const
00108 {
00109 ACE_TRACE ("ACE_SOCK_IO::send");
00110
00111 va_list argp;
00112 int const total_tuples = ACE_Utils::truncate_cast<int> (n / 2);
00113 iovec *iovp = 0;
00114 #if defined (ACE_HAS_ALLOCA)
00115 iovp = (iovec *) alloca (total_tuples * sizeof (iovec));
00116 #else
00117 ACE_NEW_RETURN (iovp,
00118 iovec[total_tuples],
00119 -1);
00120 #endif
00121
00122 va_start (argp, n);
00123
00124 for (int i = 0; i < total_tuples; i++)
00125 {
00126 iovp[i].iov_base = va_arg (argp, char *);
00127 iovp[i].iov_len = va_arg (argp, int);
00128 }
00129
00130 ssize_t const result = ACE_OS::sendv (this->get_handle (),
00131 iovp,
00132 total_tuples);
00133 #if !defined (ACE_HAS_ALLOCA)
00134 delete [] iovp;
00135 #endif
00136 va_end (argp);
00137 return result;
00138 }
00139
00140
00141
00142
00143
00144
00145
00146 ssize_t
00147 ACE_SOCK_IO::recv (size_t n, ...) const
00148 {
00149 ACE_TRACE ("ACE_SOCK_IO::recv");
00150
00151 va_list argp;
00152 int const total_tuples = ACE_Utils::truncate_cast<int> (n / 2);
00153 iovec *iovp;
00154 #if defined (ACE_HAS_ALLOCA)
00155 iovp = (iovec *) alloca (total_tuples * sizeof (iovec));
00156 #else
00157 ACE_NEW_RETURN (iovp,
00158 iovec[total_tuples],
00159 -1);
00160 #endif
00161
00162 va_start (argp, n);
00163
00164 for (int i = 0; i < total_tuples; i++)
00165 {
00166 iovp[i].iov_base = va_arg (argp, char *);
00167 iovp[i].iov_len = va_arg (argp, int);
00168 }
00169
00170 ssize_t const result = ACE_OS::recvv (this->get_handle (),
00171 iovp,
00172 total_tuples);
00173 #if !defined (ACE_HAS_ALLOCA)
00174 delete [] iovp;
00175 #endif
00176 va_end (argp);
00177 return result;
00178 }
00179
00180 ACE_END_VERSIONED_NAMESPACE_DECL