network_events.cpp
来自「ace开发环境 用来开发网络程序 其运用了设计模式、多平台、C++等多种知识」· C++ 代码 · 共 212 行
CPP
212 行
// $Id: Network_Events.cpp 56417 2004-03-14 12:48:07Z jwillemsen $//// ============================================================================//// = LIBRARY// examples//// = FILENAME// Network_Events.cpp//// = DESCRIPTION//// This application tests Reactor to make sure that it responds// correctly to different kinds of network events.//// The test starts off by creating a Network_Listener, that listens// for connections at ACE_DEFAULT_SERVER_PORT. When a client// connects, a Network_Handler is created. Network_Handler reads// messages off the socket and prints them out. This is done until// the remote side shuts down. Multiple clients can connect at the// same time.//// Events tested in this example includes ACCEPT, READ, and CLOSE masks.//// To run this example, start an instance of this example and// connect to it using telnet (to port// ACE_DEFAULT_SERVER_PORT(20002)).//// = AUTHOR// Irfan Pyarali//// ============================================================================#include "ace/Reactor.h"#include "ace/WFMO_Reactor.h"#include "ace/INET_Addr.h"#include "ace/SOCK_Stream.h"#include "ace/SOCK_Acceptor.h"#include "ace/OS_main.h"ACE_RCSID(WFMO_Reactor, Network_Events, "$Id: Network_Events.cpp 56417 2004-03-14 12:48:07Z jwillemsen $")class Network_Handler : public ACE_Event_Handler{public: Network_Handler (ACE_SOCK_Stream &s); // Default constructor virtual int handle_input (ACE_HANDLE handle); virtual int handle_close (ACE_HANDLE handle, ACE_Reactor_Mask close_mask); virtual ACE_HANDLE get_handle (void) const; ACE_SOCK_Stream stream_;};Network_Handler::Network_Handler (ACE_SOCK_Stream &s) : stream_ (s){ this->reactor (ACE_Reactor::instance ()); int result = this->reactor ()->register_handler (this, READ_MASK); ACE_ASSERT (result == 0); ACE_UNUSED_ARG (result);}ACE_HANDLENetwork_Handler::get_handle (void) const{ return this->stream_.get_handle ();}intNetwork_Handler::handle_input (ACE_HANDLE handle){ ACE_DEBUG ((LM_DEBUG, "Network_Handler::handle_input handle = %d\n", handle)); while (1) { char message[BUFSIZ]; int result = this->stream_.recv (message, sizeof message); if (result > 0) { message[result] = 0; ACE_DEBUG ((LM_DEBUG, "Remote message: %s\n", message)); } else if (result == 0) { ACE_DEBUG ((LM_DEBUG, "Connection closed\n")); return -1; } else if (errno == EWOULDBLOCK) { return 0; } else { ACE_DEBUG ((LM_DEBUG, "Problems in receiving data, result = %d", result)); return -1; } }}intNetwork_Handler::handle_close (ACE_HANDLE handle, ACE_Reactor_Mask){ ACE_DEBUG ((LM_DEBUG, "Network_Handler::handle_close handle = %d\n", handle)); this->stream_.close (); delete this; ACE_Reactor::end_event_loop (); return 0;}class Network_Listener : public ACE_Event_Handler{public: Network_Listener (void); // Default constructor ~Network_Listener (void); // Default constructor virtual int handle_input (ACE_HANDLE handle); virtual int handle_close (ACE_HANDLE handle, ACE_Reactor_Mask close_mask); ACE_HANDLE get_handle (void) const; ACE_INET_Addr local_address_; ACE_SOCK_Acceptor acceptor_;};Network_Listener::Network_Listener (void) : local_address_ (ACE_DEFAULT_SERVER_PORT), acceptor_ (local_address_, 1){ this->reactor (ACE_Reactor::instance ()); int result = this->reactor ()->register_handler (this, ACE_Event_Handler::ACCEPT_MASK); ACE_ASSERT (result == 0); ACE_UNUSED_ARG (result);}Network_Listener::~Network_Listener (void){}ACE_HANDLENetwork_Listener::get_handle (void) const{ return this->acceptor_.get_handle ();}intNetwork_Listener::handle_input (ACE_HANDLE handle){ ACE_DEBUG ((LM_DEBUG, "Network_Listener::handle_input handle = %d\n", handle)); ACE_INET_Addr remote_address; ACE_SOCK_Stream stream; // Try to find out if the implementation of the reactor that we are // using requires us to reset the event association for the newly // created handle. This is because the newly created handle will // inherit the properties of the listen handle, including its event // associations. int reset_new_handle = this->reactor ()->uses_event_associations (); int result = this->acceptor_.accept (stream, // stream &remote_address, // remote address 0, // timeout 1, // restart reset_new_handle); // reset new handler ACE_ASSERT (result == 0); ACE_UNUSED_ARG (result); ACE_DEBUG ((LM_DEBUG, "Remote connection from: ")); remote_address.dump (); Network_Handler *handler; ACE_NEW_RETURN (handler, Network_Handler (stream), -1); return 0;}intNetwork_Listener::handle_close (ACE_HANDLE handle, ACE_Reactor_Mask){ ACE_DEBUG ((LM_DEBUG, "Network_Listener::handle_close handle = %d\n", handle)); this->acceptor_.close (); delete this; return 0;}intACE_TMAIN (int, ACE_TCHAR *[]){ Network_Listener *listener = 0; listener = new Network_Listener; ACE_Reactor::run_event_loop (); return 0;};
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?