Go to the documentation of this file.00001
00002
00003 #include "ace/SOCK_SEQPACK_Association.h"
00004
00005 #include "ace/Auto_Ptr.h"
00006 #include "ace/Log_Msg.h"
00007 #include "ace/OS_Memory.h"
00008 #include "ace/OS_NS_string.h"
00009
00010 #if !defined (__ACE_INLINE__)
00011 #include "ace/SOCK_SEQPACK_Association.inl"
00012 #endif
00013
00014 ACE_RCSID(ace, SOCK_SEQPACK_Association, "$Id: SOCK_SEQPACK_Association.cpp 83832 2008-11-18 10:30:32Z johnnyw $")
00015
00016 ACE_BEGIN_VERSIONED_NAMESPACE_DECL
00017
00018 ACE_ALLOC_HOOK_DEFINE(ACE_SOCK_SEQPACK_Association)
00019
00020 void
00021 ACE_SOCK_SEQPACK_Association::dump (void) const
00022 {
00023 #if defined (ACE_HAS_DUMP)
00024 ACE_TRACE ("ACE_SOCK_SEQPACK_Association::dump");
00025 #endif
00026 }
00027
00028 int
00029 ACE_SOCK_SEQPACK_Association::close (void)
00030 {
00031 #if defined (ACE_WIN32)
00032
00033
00034
00035
00036
00037
00038 this->close_writer ();
00039 #endif
00040
00041 return ACE_SOCK::close ();
00042 }
00043
00044
00045
00046
00047 int
00048 ACE_SOCK_SEQPACK_Association::abort (void)
00049 {
00050
00051
00052
00053
00054 linger slinger;
00055
00056 slinger.l_onoff = 1;
00057 slinger.l_linger = 0;
00058
00059 if (-1 == ACE_OS::setsockopt (this->get_handle (),
00060 SOL_SOCKET,
00061 SO_LINGER,
00062 reinterpret_cast<const char *> (&slinger),
00063 sizeof (linger)))
00064 {
00065 return -1;
00066 }
00067
00068 return this->close ();
00069 }
00070
00071 int
00072 ACE_SOCK_SEQPACK_Association::get_local_addrs (ACE_INET_Addr *addrs, size_t &size) const
00073 {
00074 ACE_TRACE ("ACE_SOCK_SEQPACK_Association::get_local_addrs");
00075
00076 #if defined (ACE_HAS_LKSCTP)
00077
00078
00079
00080
00081
00082
00083
00084
00085
00086
00087
00088
00089
00090
00091
00092
00093
00094 sockaddr_in *si = 0;
00095 sockaddr *laddrs = 0;
00096 int err = 0;
00097 size_t len = 0;
00098
00099 #ifndef ACE_HAS_VOID_PTR_SCTP_GETLADDRS
00100 err = sctp_getladdrs(this->get_handle(), 0, &laddrs);
00101 #else
00102 err = sctp_getladdrs(this->get_handle(), 0, reinterpret_cast<void**>(&laddrs));
00103 #endif
00104 if (err > 0)
00105 {
00106 len = err;
00107
00108
00109 if (len > size)
00110 {
00111
00112
00113 len = size;
00114 }
00115
00116 for (size_t i = 0; i < len; i++)
00117 {
00118
00119
00120 si = (sockaddr_in *) (&(laddrs[i]));
00121
00122
00123 addrs[i].set_addr(si, sizeof(sockaddr_in));
00124 addrs[i].set_type(si->sin_family);
00125 addrs[i].set_size(sizeof(sockaddr_in));
00126 }
00127 }
00128 else
00129 {
00130
00131 return -1;
00132 }
00133
00134
00135 size = len;
00136
00137
00138 sctp_freeladdrs(laddrs);
00139
00140 #else
00141
00142
00143
00144
00145
00146
00147
00148
00149
00150
00151
00152
00153
00154
00155
00156
00157
00158
00159 ACE_Auto_Array_Ptr<sockaddr_in> addr_structs;
00160
00161
00162
00163
00164
00165 {
00166 sockaddr_in *addr_structs_bootstrap = 0;
00167 ACE_NEW_RETURN (addr_structs_bootstrap, sockaddr_in[size], -1);
00168 addr_structs.reset(addr_structs_bootstrap);
00169 }
00170
00171
00172
00173 size_t physical_size = size * sizeof(sockaddr_in);
00174
00175
00176 ACE_OS::memset(addr_structs.get(),
00177 0,
00178 physical_size);
00179
00180
00181
00182
00183
00184
00185
00186 int name_size = static_cast<int> (physical_size);
00187 if (ACE_OS::getsockname (this->get_handle (),
00188 reinterpret_cast<sockaddr *> (addr_structs.get()),
00189 &name_size) == -1)
00190 return -1;
00191
00192
00193 name_size /= sizeof (sockaddr_in);
00194 size = static_cast<size_t> (name_size);
00195
00196
00197
00198 const int addrlen (static_cast<int> (sizeof (sockaddr_in)));
00199 for (int i = 0; i < name_size; ++i)
00200 {
00201 addrs[i].set_addr (&(addr_structs[i]), addrlen);
00202 addrs[i].set_type (addr_structs[i].sin_family);
00203 addrs[i].set_size (addrlen);
00204 }
00205 #endif
00206 return 0;
00207 }
00208
00209
00210 int
00211 ACE_SOCK_SEQPACK_Association::get_remote_addrs (ACE_INET_Addr *addrs, size_t &size) const
00212 {
00213 ACE_TRACE ("ACE_SOCK_SEQPACK_Association::get_remote_addrs");
00214 #if defined (ACE_HAS_LKSCTP)
00215
00216
00217
00218
00219
00220
00221
00222
00223
00224
00225
00226
00227
00228
00229
00230
00231
00232 sockaddr_in *si = 0;
00233 sockaddr *paddrs = 0;
00234 int err = 0;
00235 size_t len = 0;
00236
00237 #ifndef ACE_HAS_VOID_PTR_SCTP_GETPADDRS
00238 err = sctp_getpaddrs(this->get_handle(), 0, &paddrs);
00239 #else
00240 err = sctp_getpaddrs(this->get_handle(), 0, reinterpret_cast<void**>(&paddrs));
00241 #endif
00242
00243 if (err > 0)
00244 {
00245 len = err;
00246
00247
00248 if (len > size)
00249 {
00250
00251
00252 len = size;
00253 }
00254
00255 for (size_t i = 0; i < len; i++)
00256 {
00257
00258
00259 si = (sockaddr_in *) (&(paddrs[i]));
00260
00261
00262 addrs[i].set_addr(si, sizeof(sockaddr_in));
00263 addrs[i].set_type(si->sin_family);
00264 addrs[i].set_size(sizeof(sockaddr_in));
00265 }
00266 }
00267 else
00268 {
00269
00270 return -1;
00271 }
00272
00273
00274 size = len;
00275
00276
00277 sctp_freepaddrs(paddrs);
00278
00279 #else
00280
00281
00282
00283
00284
00285
00286
00287
00288
00289
00290
00291
00292
00293
00294
00295
00296
00297
00298 ACE_Auto_Array_Ptr<sockaddr_in> addr_structs;
00299
00300
00301
00302
00303
00304 {
00305 sockaddr_in *addr_structs_bootstrap = 0;
00306 ACE_NEW_RETURN (addr_structs_bootstrap, sockaddr_in[size], -1);
00307 addr_structs.reset(addr_structs_bootstrap);
00308 }
00309
00310
00311
00312 size_t physical_size = size * sizeof(sockaddr_in);
00313
00314
00315 ACE_OS::memset(addr_structs.get(),
00316 0,
00317 physical_size);
00318
00319
00320
00321
00322
00323
00324
00325 int name_size = static_cast<int> (physical_size);
00326 if (ACE_OS::getpeername (this->get_handle (),
00327 reinterpret_cast<sockaddr *> (addr_structs.get()),
00328 &name_size) == -1)
00329 return -1;
00330
00331
00332 name_size /= sizeof (sockaddr_in);
00333 size = static_cast<size_t> (name_size);
00334
00335
00336
00337 const int addrlen (static_cast<int> (sizeof (sockaddr_in)));
00338 for (int i = 0; i < name_size; ++i)
00339 {
00340 addrs[i].set_addr (&(addr_structs[i]), addrlen);
00341 addrs[i].set_type (addr_structs[i].sin_family);
00342 addrs[i].set_size (addrlen);
00343 }
00344 #endif
00345 return 0;
00346 }
00347
00348 ACE_END_VERSIONED_NAMESPACE_DECL