summaryrefslogtreecommitdiff
path: root/ACE/tests/SOCK_Dgram_Test.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'ACE/tests/SOCK_Dgram_Test.cpp')
-rw-r--r--ACE/tests/SOCK_Dgram_Test.cpp220
1 files changed, 220 insertions, 0 deletions
diff --git a/ACE/tests/SOCK_Dgram_Test.cpp b/ACE/tests/SOCK_Dgram_Test.cpp
new file mode 100644
index 00000000000..9633fe12772
--- /dev/null
+++ b/ACE/tests/SOCK_Dgram_Test.cpp
@@ -0,0 +1,220 @@
+// $Id$
+// ===========================================================================
+//
+// = LIBRARY
+// tests
+//
+// = FILENAME
+// SOCK_Dgram.cpp
+//
+// = DESCRIPTION
+// Tests that a call to open with an any address binds to the any address
+// for the protocol passed in.
+//
+// This test uses the same test setup as SOCK_Test.
+//
+// = AUTHOR
+// Brian Buesker (bbuesker@qualcomm.com)
+//
+// ==========================================================================
+
+#include "test_config.h"
+#include "ace/OS_NS_sys_wait.h"
+#include "ace/Thread.h"
+#include "ace/Thread_Manager.h"
+#include "ace/SOCK_Dgram.h"
+#include "ace/Log_Msg.h"
+#include "ace/Time_Value.h"
+#include "ace/OS_NS_unistd.h"
+
+#define SERVER_PORT 20000
+#define TEST_DATA ACE_TEXT ("UDP Open Test")
+
+static void *
+client (void *arg)
+{
+ ACE_INET_Addr *remote_addr = (ACE_INET_Addr *) arg;
+ ACE_INET_Addr server_addr, peer_addr;
+ ACE_SOCK_Dgram cli_dgram;
+ ACE_Time_Value timeout (1);
+
+ char buf[20];
+
+ ACE_TCHAR hostname_string[100];
+
+ if (remote_addr->get_type () == AF_INET)
+ {
+ server_addr.set (remote_addr->get_port_number (),
+ ACE_LOCALHOST);
+ }
+#if defined (ACE_HAS_IPV6)
+ else
+ {
+ server_addr.set (remote_addr->get_port_number(),
+ ACE_IPV6_LOCALHOST);
+ }
+#endif /* ACE_HAS_IPV6 */
+
+ ACE_DEBUG ((LM_DEBUG, ACE_TEXT ("(%P|%t) starting client UDP send\n")));
+
+ if (cli_dgram.open (ACE_Addr::sap_any, server_addr.get_type ()) == -1)
+ {
+ ACE_ERROR((LM_ERROR,
+ ACE_TEXT("%p\n"),
+ ACE_TEXT("open SOCK_Dgram failed for client for protocol")
+ ACE_TEXT(" = %d\n"),
+ server_addr.get_type ()));
+ }
+ else if (cli_dgram.send (TEST_DATA, sizeof (TEST_DATA), server_addr) == -1)
+ {
+ server_addr.addr_to_string (hostname_string, 100);
+ ACE_ERROR((LM_ERROR,
+ ACE_TEXT("%p\n"),
+ ACE_TEXT("UDP send to %s\n"),
+ hostname_string));
+ }
+ else if (cli_dgram.recv (buf, sizeof (buf), peer_addr, 0, &timeout) == -1)
+ {
+ if (errno == ETIME)
+ {
+ ACE_ERROR((LM_ERROR,
+ ACE_TEXT("%p\n"),
+ ACE_TEXT("recv for UDP over IPv4 timed out")));
+ }
+ else
+ {
+ ACE_ERROR((LM_ERROR,
+ ACE_TEXT("%p\n"),
+ ACE_TEXT("recv for UDP over IPv4 failed")));
+ }
+ }
+
+ cli_dgram.close();
+
+ return 0;
+}
+
+static void *
+server (void *arg)
+{
+ ACE_SOCK_Dgram *server_dgram = (ACE_SOCK_Dgram *) arg;
+
+ ACE_INET_Addr peer_addr;
+
+ char buf[20];
+ ACE_TCHAR hostname_string[100];
+
+ if (server_dgram->recv (buf, sizeof (buf), peer_addr, 0) == -1)
+ {
+ ACE_ERROR((LM_ERROR,
+ ACE_TEXT("%p\n"),
+ ACE_TEXT("recv for UDP over IPv6 failed")));
+ }
+ else if (server_dgram->send (TEST_DATA, sizeof (TEST_DATA),
+ peer_addr, 0) == -1)
+ {
+ peer_addr.addr_to_string (hostname_string, sizeof (hostname_string));
+ ACE_ERROR((LM_ERROR,
+ ACE_TEXT("%p\n"),
+ ACE_TEXT("Server UDP send to %s failed"),
+ hostname_string));
+ }
+ server_dgram->close ();
+
+ return 0;
+}
+
+static void
+spawn (int proto)
+{
+ ACE_SOCK_Dgram server_dgram;
+
+ ACE_INET_Addr server_addr;
+
+ if (proto == AF_INET)
+ {
+ server_addr.set (SERVER_PORT,
+ ACE_LOCALHOST);
+ }
+#if defined (ACE_HAS_IPV6)
+ else
+ {
+ server_addr.set (SERVER_PORT,
+ ACE_IPV6_LOCALHOST);
+ }
+#endif /* ACE_HAS_IPV6 */
+
+ // Bind UDP server to the appropriate port
+ if (server_dgram.open (server_addr, proto) == -1)
+ ACE_ERROR ((LM_ERROR, ACE_TEXT ("(%P|%t) %p\n"), ACE_TEXT ("server open")));
+ else
+ {
+ ACE_DEBUG ((LM_DEBUG, ACE_TEXT ("(%P|%t) started server at port %d\n"),
+ server_addr.get_port_number ()));
+#if !defined (ACE_LACKS_FORK)
+ switch (ACE_OS::fork (ACE_TEXT ("child")))
+ {
+ case -1:
+ ACE_ERROR ((LM_ERROR,
+ ACE_TEXT ("(%P|%t) %p\n%a"),
+ ACE_TEXT ("fork failed"),
+ 1));
+ /* NOTREACHED */
+ case 0:
+ client (&server_addr);
+ ACE_OS::exit (0);
+ /* NOTREACHED */
+ default:
+ server ((void *) &server_dgram);
+ ACE_OS::wait ();
+ }
+#elif defined (ACE_HAS_THREADS)
+ if (ACE_Thread_Manager::instance ()->spawn
+ (ACE_THR_FUNC (server),
+ (void *) &server_dgram,
+ THR_NEW_LWP | THR_DETACHED) == -1)
+ ACE_ERROR ((LM_ERROR,
+ ACE_TEXT ("(%P|%t) %p\n%a"),
+ ACE_TEXT ("thread create failed"),
+ 1));
+
+ if (ACE_Thread_Manager::instance ()->spawn
+ (ACE_THR_FUNC (client),
+ (void *) &server_addr,
+ THR_NEW_LWP | THR_DETACHED) == -1)
+ ACE_ERROR ((LM_ERROR,
+ ACE_TEXT ("(%P|%t) %p\n%a"),
+ ACE_TEXT ("thread create failed"),
+ 1));
+
+ // Wait for the threads to exit.
+ ACE_Thread_Manager::instance ()->wait ();
+#else
+ ACE_ERROR ((LM_INFO,
+ ACE_TEXT ("(%P|%t) ")
+ ACE_TEXT ("only one thread may be run ")
+ ACE_TEXT ("in a process on this platform\n")));
+#endif /* ACE_HAS_THREADS */
+
+ server_dgram.close ();
+ }
+}
+
+int run_main (int argc, ACE_TCHAR *argv[])
+{
+ ACE_UNUSED_ARG (argc);
+ ACE_UNUSED_ARG (argv);
+
+ ACE_START_TEST (ACE_TEXT ("SOCK_Dgram_Test"));
+
+ spawn (AF_INET);
+
+#if defined (ACE_HAS_IPV6)
+
+ spawn (AF_INET6);
+
+#endif /* ACE_HAS_IPV6 */
+
+ ACE_END_TEST;
+ return 0;
+}