ntalker.cpp
来自「ace开发环境 用来开发网络程序 其运用了设计模式、多平台、C++等多种知识」· C++ 代码 · 共 232 行
CPP
232 行
// $Id: ntalker.cpp 54959 2003-12-30 23:18:59Z shuston $// Listens to multicast address. After first message received, will// listen for 5 more seconds. Prints Mbits/sec received from client.#include "ace/OS_main.h"#include "ace/OS_NS_unistd.h"#include "ace/INET_Addr.h"#include "ace/SOCK_Dgram_Mcast.h"#include "ace/Reactor.h"#include "ace/Get_Opt.h"#include "ace/Thread_Manager.h"#include "ace/Service_Config.h"ACE_RCSID(Ntalker, ntalker, "$Id: ntalker.cpp 54959 2003-12-30 23:18:59Z shuston $")#if defined (ACE_HAS_IP_MULTICAST)// Network interface to subscribe to. This is hardware specific. use// netstat(1M) to find whether your interface is le0 or ie0static const ACE_TCHAR *INTERFACE = 0;static const char *MCAST_ADDR = ACE_DEFAULT_MULTICAST_ADDR;static const u_short UDP_PORT = ACE_DEFAULT_MULTICAST_PORT;class Handler : public ACE_Event_Handler{ // = TITLE // Handle both multicast and stdin events.public: // = Initialization and termination methods. Handler (u_short udp_port, const char *ip_addr, const ACE_TCHAR *a_interface, ACE_Reactor & ); // Constructor. ~Handler (void); // Destructor. // Event demuxer hooks. virtual int handle_input (ACE_HANDLE); virtual int handle_close (ACE_HANDLE, ACE_Reactor_Mask); virtual ACE_HANDLE get_handle (void) const;private: ACE_SOCK_Dgram_Mcast mcast_; // Multicast wrapper.};ACE_HANDLEHandler::get_handle (void) const{ return this->mcast_.get_handle ();}intHandler::handle_input (ACE_HANDLE h){ char buf[BUFSIZ]; if (h == ACE_STDIN) { ssize_t result = ACE_OS::read (h, buf, BUFSIZ); if (result > 0) { if (this->mcast_.send (buf, result) != result) ACE_ERROR_RETURN ((LM_ERROR, "%p\n", "send error"), -1); return 0; } else if (result == -1) ACE_ERROR_RETURN ((LM_ERROR, "%p\n", "can't read from STDIN"), -1); else // result == 0 { ACE_Reactor::end_event_loop (); return -1; } } else { ACE_INET_Addr remote_addr; // Receive message from multicast group. ssize_t result = this->mcast_.recv (buf, sizeof buf, remote_addr); if (result != -1) { ACE_DEBUG ((LM_DEBUG, "received datagram from host %s on port %d bytes = %d\n", remote_addr.get_host_name (), remote_addr.get_port_number (), result)); ACE_OS::write (ACE_STDERR, buf, result); ACE_DEBUG ((LM_DEBUG, "\n")); return 0; } ACE_ERROR_RETURN ((LM_ERROR, "%p\n", "something amiss"), -1); }}intHandler::handle_close (ACE_HANDLE h, ACE_Reactor_Mask){ if (h == ACE_STDIN) { ACE_DEBUG ((LM_DEBUG, "STDIN_Events handle removed from reactor.\n")); if (ACE_Reactor::instance ()->remove_handler (this, ACE_Event_Handler::READ_MASK) == -1) ACE_ERROR_RETURN ((LM_ERROR, "%p\n", "remove_handler"), -1); } else ACE_DEBUG ((LM_DEBUG, "Mcast_Events handle removed from reactor.\n")); return 0;}Handler::~Handler (void){ if (this->mcast_.unsubscribe () == -1) ACE_ERROR ((LM_ERROR, "%p\n", "unsubscribe fails"));}Handler::Handler (u_short udp_port, const char *ip_addr, const ACE_TCHAR *a_interface, ACE_Reactor &reactor){ // Create multicast address to listen on. ACE_INET_Addr sockmc_addr (udp_port, ip_addr); // subscribe to multicast group. if (this->mcast_.subscribe (sockmc_addr, 1, a_interface) == -1) { ACE_ERROR ((LM_ERROR, "%p\n", "can't subscribe to multicast group")); } // Disable loopbacks. // if (this->mcast_.set_option (IP_MULTICAST_LOOP, 0) == -1 ) // ACE_OS::perror (" can't disable loopbacks " ), ACE_OS::exit (1); // Register callbacks with the ACE_Reactor. else if (reactor.register_handler (this->mcast_.get_handle (), this, ACE_Event_Handler::READ_MASK) == -1) ACE_ERROR ((LM_ERROR, "%p\n", "can't register with Reactor\n")); // Register the STDIN handler. else if (ACE_Event_Handler::register_stdin_handler (this, ACE_Reactor::instance (), ACE_Thread_Manager::instance ()) == -1) ACE_ERROR ((LM_ERROR, "%p\n", "register_stdin_handler"));}static voidparse_args (int argc, ACE_TCHAR *argv[]){ ACE_Get_Opt get_opt (argc, argv, ACE_TEXT("i:u")); int c; while ((c = get_opt ()) != -1) switch (c) { case 'i': INTERFACE = get_opt.opt_arg (); break; case 'u': // Usage fallthrough. default: ACE_DEBUG ((LM_DEBUG, "%s -i interface\n", argv[0])); ACE_OS::exit (1); }}intACE_TMAIN (int argc, ACE_TCHAR *argv[]){ parse_args (argc, argv); Handler handler (UDP_PORT, MCAST_ADDR, INTERFACE, *ACE_Reactor::instance ()); // Run the event loop. ACE_Reactor::run_event_loop (); ACE_DEBUG ((LM_DEBUG, "talker Done.\n")); return 0;}#elseintACE_TMAIN (int, ACE_TCHAR *argv[]){ ACE_ERROR_RETURN ((LM_ERROR, "error: %s must be run on a platform that support IP multicast\n", argv[0]), 0);}#endif /* ACE_HAS_IP_MULTICAST */
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?