diff options
Diffstat (limited to 'ACE/apps/drwho/CM_Client.cpp')
-rw-r--r-- | ACE/apps/drwho/CM_Client.cpp | 143 |
1 files changed, 143 insertions, 0 deletions
diff --git a/ACE/apps/drwho/CM_Client.cpp b/ACE/apps/drwho/CM_Client.cpp new file mode 100644 index 00000000000..970529a59d3 --- /dev/null +++ b/ACE/apps/drwho/CM_Client.cpp @@ -0,0 +1,143 @@ +// $Id$ + +#include "Options.h" +#include "Multicast_Manager.h" +#include "CM_Client.h" +#include "ace/Log_Msg.h" +#include "ace/OS_NS_string.h" +#include "ace/OS_NS_sys_socket.h" +#include "ace/OS_NS_sys_select.h" +#include "ace/OS_NS_netdb.h" +#include "ace/OS_NS_arpa_inet.h" +#include "ace/os_include/os_string.h" + +// Creates and binds a UDP socket... + +int +CM_Client::open (short port_number) +{ + Comm_Manager::sokfd_ = ACE_OS::socket (PF_INET, SOCK_DGRAM, 0); + + if (Comm_Manager::sokfd_ == ACE_INVALID_HANDLE) + return -1; + + ACE_OS::memset ((char *) &this->sin_, + 0, + sizeof this->sin_); + this->sin_.sin_family = AF_INET; + this->sin_.sin_port = htons (port_number); + + return 1; +} + +int +CM_Client::receive (int timeout) +{ + FD_ZERO (&this->read_fd_); + FD_SET (Comm_Manager::sokfd_, &this->read_fd_); + + if (timeout > 0) + { + this->time_out_.sec (timeout); + this->time_out_.usec (0); + this->top_ = &time_out_; + } + + while (Multicast_Manager::outstanding_hosts_remain ()) + { + if (ACE_OS::select (Comm_Manager::sokfd_ + 1, + &this->read_fd_, + 0, + 0, + this->top_) <= 0) + break; + else + { + int sin_len = sizeof this->sin_; + int n = ACE_OS::recvfrom ((int)Comm_Manager::sokfd_, + this->recv_packet_, + UDP_PACKET_SIZE, + 0, + reinterpret_cast<sockaddr *> (&this->sin_), + &sin_len); + if (n < 0) + return -1; + else + { + if (Options::get_opt (Options::DEBUG) != 0) + { + hostent *np = ACE_OS::gethostbyaddr ((char *) &this->sin_.sin_addr, + sizeof this->sin_.sin_addr, + AF_INET); + + ACE_DEBUG ((LM_DEBUG, + "receiving from server host %s (%s)\n", + np->h_name, + ACE_OS::inet_ntoa (this->sin_.sin_addr))); + } + + if (this->demux (this->recv_packet_, n) < 0) + return -1; + + Multicast_Manager::checkoff_host (this->sin_.sin_addr); + } + } + } + + for (const char *host_name; + Multicast_Manager::get_next_non_responding_host (host_name); + ) + ACE_DEBUG ((LM_DEBUG, + "%s did not respond\n", + host_name)); + return 1; +} + +int +CM_Client::send (void) +{ + int packet_length = 0; + + if (this->mux (this->send_packet_, packet_length) < 0) + return -1; + + // Ship off the info to all the hosts. + + while (Multicast_Manager::get_next_host_addr (this->sin_.sin_addr) != 0) + { + if (Options::get_opt (Options::DEBUG) != 0) + { + hostent *np = ACE_OS::gethostbyaddr ((char *) &this->sin_.sin_addr, + sizeof this->sin_.sin_addr, + AF_INET); + + ACE_DEBUG ((LM_DEBUG, + "sending to server host %s (%s)\n", + np->h_name, + inet_ntoa (this->sin_.sin_addr))); + } + + if (sendto (Comm_Manager::sokfd_, + this->send_packet_, + packet_length, + 0, + reinterpret_cast<sockaddr *> (&this->sin_), + sizeof this->sin_) < 0) + return -1; + } + return 1; +} + +CM_Client::CM_Client (void) + : top_ (0) +{ +} + +CM_Client::~CM_Client (void) +{ + if (Options::get_opt (Options::DEBUG)) + ACE_DEBUG ((LM_DEBUG, + "disposing CM_Client\n")); + + ACE_OS::closesocket ((int)Comm_Manager::sokfd_); +} |