/* \brief Just runs automatic tests Function sends a number of datagrams, spawns child thread or process and tries to receive at least one datagram. \retval 0 datagram was received \retval -1 datagram was not received */ int run_auto_test (const ACE_TCHAR *prog_name) { #if defined (ACE_HAS_PROCESS_SPAWN) ACE_DEBUG ((LM_INFO, ACE_TEXT ("Running auto_tests in process mode\n"))); ACE_Process_Options opts; pid_t child_pid; opts.command_line (ACE_TEXT ("%s -p %d -t %d -a -r"), prog_name, dgram_port, dgram_recv_timeout.msec ()); if ((child_pid = ACE_Process_Manager::instance ()->spawn (opts)) == -1) ACE_ERROR_RETURN ((LM_ERROR, ACE_TEXT ("%p\n"), ACE_TEXT ("spawn_n()")), -1); #elif defined (ACE_HAS_THREADS) ACE_UNUSED_ARG (prog_name); ACE_DEBUG ((LM_INFO, ACE_TEXT ("Running auto_tests in thread mode\n"))); if (ACE_Thread_Manager::instance ()->spawn (run_thread_receiver) == -1) ACE_ERROR_RETURN ((LM_ERROR, ACE_TEXT ("%p\n"), ACE_TEXT ("spawn_n ()")), -1); #else ACE_ERROR_RETURN ((LM_ERROR, ACE_TEXT ("Cannot run in auto_test mode without fork or threads.\n")), -1); #endif /* defined (ACE_HAS_PROCESS_SPAWN) */ ACE_DEBUG ((LM_INFO, ACE_TEXT ("Sending datagrams on port %d in auto_test mode\n"), dgram_port)); ACE_SOCK_Dgram_Bcast socket; if (socket.open (ACE_Addr::sap_any) != -1) { // send datagrams until child finishes while (1) { send_datagram (socket, dgrams_no--); ACE_Time_Value child_timeout (1); #if defined (ACE_HAS_PROCESS_SPAWN) if (ACE_Process_Manager::instance ()->wait (child_pid, child_timeout, &receiver_exit_code) == child_pid) break; #else /* ACE_HAS_THREADS */ // sleep 1 second or wait for child thread child_timeout += ACE_OS::gettimeofday () ; if (ACE_Thread_Manager::instance ()->wait (&child_timeout) == 0) break; #endif } socket.close (); ACE_DEBUG ((LM_INFO, ACE_TEXT ("Child finished with %d exit code\n"), receiver_exit_code)); } else ACE_ERROR_RETURN ((LM_ERROR, ACE_TEXT ("%p\n"), ACE_TEXT ("Cannot open broadcast socket")), -1); return (receiver_exit_code); }
int ACE_TMAIN (int argc, ACE_TCHAR *argv[]) { program_name = argv[0]; parse_args (argc, argv); ACE_SOCK_Dgram_Bcast sd (ACE_Addr::sap_any); static char buf[] = "testing socket broadcast service"; if (sd.send (buf, ACE_OS::strlen (buf), broadcast_port_number) == -1) ACE_ERROR_RETURN ((LM_ERROR, "%p\n", "can't send broadcast"), -1); return 0; }
int SendBroadcast() { const char* message = "this is a message!\n"; ACE_INET_Addr sender (27016, ACE_LOCALHOST); ACE_SOCK_Dgram_Bcast udp (sender); unsigned short listenerPort = 27015; ssize_t sent = udp.send(message, ACE_OS_String::strlen(message) + 1, listenerPort); udp.close(); if (sent == -1) { ACE_ERROR_RETURN((LM_ERROR, ACE_TEXT("%p\n"), ACE_TEXT("send")), -1); } cout << "sent: " << sent << " bytes" << endl; return 0; }
/*\brief Send a sequence of datagrams with 1 second period \note Th function employs dgram_port and dgrams_no global variables \retval -1 if error \retval 0 if sent */ int run_sender( ) { ACE_DEBUG ((LM_INFO, ACE_TEXT ("Sending %d datagrams on port %d\n"), dgrams_no, dgram_port)); ACE_SOCK_Dgram_Bcast socket; if (socket.open (ACE_Addr::sap_any) != -1) { while (dgrams_no-- != 0) { if (send_datagram (socket, dgrams_no) < 0) break; ACE_OS::sleep (1); } socket.close (); return (0); } ACE_ERROR_RETURN ((LM_ERROR, ACE_TEXT ("%p\n"), ACE_TEXT ("Cannot open broadcast socket")), -1); }
/*\brief Create and send single datagram \param socket broadcast over this socket \param datagram_no datagram identifier \return -1 if error, 0 if OK */ int send_datagram (ACE_SOCK_Dgram_Bcast &socket, int datagram_no) { static char dgram_buffer[BUFSIZ]; ACE_OS::snprintf (dgram_buffer, sizeof(dgram_buffer), "Datagram %d", datagram_no); if (socket.send (dgram_buffer, ACE_OS::strlen (dgram_buffer) + 1, dgram_port) < 0 ) ACE_ERROR_RETURN ((LM_ERROR, ACE_TEXT ("%p\n"), ACE_TEXT ("Cannot broadcast datagram")), -1); else ACE_DEBUG ((LM_INFO, ACE_TEXT ("%C sent\n"), dgram_buffer)); return 0; }