summaryrefslogtreecommitdiff
path: root/ACE/ace/SOCK.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'ACE/ace/SOCK.cpp')
-rw-r--r--ACE/ace/SOCK.cpp185
1 files changed, 185 insertions, 0 deletions
diff --git a/ACE/ace/SOCK.cpp b/ACE/ace/SOCK.cpp
new file mode 100644
index 00000000000..c008dba43c3
--- /dev/null
+++ b/ACE/ace/SOCK.cpp
@@ -0,0 +1,185 @@
+// $Id$
+
+#include "ace/SOCK.h"
+#include "ace/Log_Msg.h"
+
+#if !defined (__ACE_INLINE__)
+#include "ace/SOCK.inl"
+#endif /* __ACE_INLINE__ */
+
+
+
+ACE_BEGIN_VERSIONED_NAMESPACE_DECL
+
+ACE_ALLOC_HOOK_DEFINE(ACE_SOCK)
+
+void
+ACE_SOCK::dump (void) const
+{
+#if defined (ACE_HAS_DUMP)
+ ACE_TRACE ("ACE_SOCK::dump");
+#endif /* ACE_HAS_DUMP */
+}
+
+ACE_SOCK::ACE_SOCK (void)
+{
+ // ACE_TRACE ("ACE_SOCK::ACE_SOCK");
+}
+
+// Returns information about the remote peer endpoint (if there is
+// one).
+
+int
+ACE_SOCK::get_remote_addr (ACE_Addr &sa) const
+{
+ ACE_TRACE ("ACE_SOCK::get_remote_addr");
+
+ int len = sa.get_size ();
+ sockaddr *addr = reinterpret_cast<sockaddr *> (sa.get_addr ());
+
+ if (ACE_OS::getpeername (this->get_handle (),
+ addr,
+ &len) == -1)
+ return -1;
+
+ sa.set_size (len);
+ sa.set_type (addr->sa_family);
+ return 0;
+}
+
+int
+ACE_SOCK::get_local_addr (ACE_Addr &sa) const
+{
+ ACE_TRACE ("ACE_SOCK::get_local_addr");
+
+ int len = sa.get_size ();
+ sockaddr *addr = reinterpret_cast<sockaddr *> (sa.get_addr ());
+
+ if (ACE_OS::getsockname (this->get_handle (),
+ addr,
+ &len) == -1)
+ return -1;
+
+ sa.set_type (addr->sa_family);
+ sa.set_size (len);
+ return 0;
+}
+
+// Close down a ACE_SOCK.
+
+int
+ACE_SOCK::close (void)
+{
+ ACE_TRACE ("ACE_SOCK::close");
+ int result = 0;
+
+ if (this->get_handle () != ACE_INVALID_HANDLE)
+ {
+ result = ACE_OS::closesocket (this->get_handle ());
+ this->set_handle (ACE_INVALID_HANDLE);
+ }
+ return result;
+}
+
+int
+ACE_SOCK::open (int type,
+ int protocol_family,
+ int protocol,
+ int reuse_addr)
+{
+ ACE_TRACE ("ACE_SOCK::open");
+ int one = 1;
+
+ this->set_handle (ACE_OS::socket (protocol_family,
+ type,
+ protocol));
+
+ if (this->get_handle () == ACE_INVALID_HANDLE)
+ return -1;
+ else if (protocol_family != PF_UNIX
+ && reuse_addr
+ && this->set_option (SOL_SOCKET,
+ SO_REUSEADDR,
+ &one,
+ sizeof one) == -1)
+ {
+ this->close ();
+ return -1;
+ }
+ return 0;
+}
+
+// General purpose constructor for performing server ACE_SOCK
+// creation.
+
+ACE_SOCK::ACE_SOCK (int type,
+ int protocol_family,
+ int protocol,
+ int reuse_addr)
+{
+ // ACE_TRACE ("ACE_SOCK::ACE_SOCK");
+ if (this->open (type,
+ protocol_family,
+ protocol,
+ reuse_addr) == -1)
+ ACE_ERROR ((LM_ERROR,
+ ACE_TEXT ("%p\n"),
+ ACE_TEXT ("ACE_SOCK::ACE_SOCK")));
+}
+
+int
+ACE_SOCK::open (int type,
+ int protocol_family,
+ int protocol,
+ ACE_Protocol_Info *protocolinfo,
+ ACE_SOCK_GROUP g,
+ u_long flags,
+ int reuse_addr)
+{
+ ACE_TRACE ("ACE_SOCK::open");
+
+ this->set_handle (ACE_OS::socket (protocol_family,
+ type,
+ protocol,
+ protocolinfo,
+ g,
+ flags));
+ int one = 1;
+
+ if (this->get_handle () == ACE_INVALID_HANDLE)
+ return -1;
+ else if (reuse_addr
+ && this->set_option (SOL_SOCKET,
+ SO_REUSEADDR,
+ &one,
+ sizeof one) == -1)
+ {
+ this->close ();
+ return -1;
+ }
+ else
+ return 0;
+}
+
+ACE_SOCK::ACE_SOCK (int type,
+ int protocol_family,
+ int protocol,
+ ACE_Protocol_Info *protocolinfo,
+ ACE_SOCK_GROUP g,
+ u_long flags,
+ int reuse_addr)
+{
+ // ACE_TRACE ("ACE_SOCK::ACE_SOCK");
+ if (this->open (type,
+ protocol_family,
+ protocol,
+ protocolinfo,
+ g,
+ flags,
+ reuse_addr) == -1)
+ ACE_ERROR ((LM_ERROR,
+ ACE_TEXT ("%p\n"),
+ ACE_TEXT ("ACE_SOCK::ACE_SOCK")));
+}
+
+ACE_END_VERSIONED_NAMESPACE_DECL