From 6eb275c7706a3d60083bb8a3f6dd8e454b98d880 Mon Sep 17 00:00:00 2001 From: fcolin Date: Thu, 1 Feb 2007 13:03:38 +0000 Subject: Utilisateur : Fcolin Date : 16/06/00 Heure : 10:14 Créé (vss 1) --- Bus/Ivy/IvyWatcher.cxx | 114 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 114 insertions(+) create mode 100644 Bus/Ivy/IvyWatcher.cxx diff --git a/Bus/Ivy/IvyWatcher.cxx b/Bus/Ivy/IvyWatcher.cxx new file mode 100644 index 0000000..c963968 --- /dev/null +++ b/Bus/Ivy/IvyWatcher.cxx @@ -0,0 +1,114 @@ +// IvyWatcher.cpp : implementation file +// + +#include "stdafx.h" + +#include "IvyWatcher.h" +#include "IvyApplication.h" + +///////////////////////////////////////////////////////////////////////////// +// IvyWatcher + + +#define VERSION 3 + +IvyWatcher::IvyWatcher(Ivy * bus) +{ + this->bus = bus; +} +IvyWatcher::~IvyWatcher() +{ +} + + + +///////////////////////////////////////////////////////////////////////////// +// IvyWatcher member functions + +void IvyWatcher::OnReceive(int nErrorCode) +{ + int err; + int version; + char buffer[256]; + string remotehost; + UINT remoteport; + UINT serviceport; + + + err = ReceiveFrom( buffer, sizeof(buffer), remotehost, remoteport ); + if ( err == SOCKET_ERROR ) + { + TRACE("Receive Broadcast error %d\n",GetLastError()); + return; + } + buffer[err] ='\0'; + err = sscanf(buffer,"%d %u",&version, &serviceport); + if ( err != 2 ) + { + /* ignore the message */ + TRACE(" Bad Supervision message expected 'version port'\n"); + return; + } + if ( version != VERSION ) + { + /* ignore the message */ + TRACE(" Bad Ivy verion number expected %d receive %d from %s:%d\n", VERSION,version, remotehost, remoteport); + return; + } + /* check if we receive our own message should test also the host */ + if ( serviceport == bus->GetApplicationPort() /*&& remotehost == "localhost"*/) return; + TRACE(" Broadcast de %s:%u port %u\n", remotehost.c_str(), remoteport, serviceport ); + + /* connect to the service and send the regexp */ + IvyApplication *newapp = new IvyApplication(bus); + // exception to catch + newapp->Create(remotehost.c_str(), serviceport); + // delete newapp; + // return; + + bus->AddApplication( newapp ); + TRACE(" Connecting to %s:%u\n", remotehost.c_str(), serviceport ); + +} + +void IvyWatcher::start(const char *domainlist) +{ + BOOL reuse = TRUE; + string domain; + UINT port; + // determine domain to use + domain = bus->GetDomain( domainlist ); + + // first find our UDP port + int sep_index = domain.rfind( ':' ); + if ( sep_index != -1 ) + { + port = atoi ( domain.substr( sep_index +1 ).c_str() ); + // supress port number from end of domain list + domain.erase( sep_index, domain.length() - sep_index ); + } + // create UDP receiver + // catch exception !!! + Socket(SOCK_DGRAM); + SetSockOpt( SO_REUSEADDR, &reuse, sizeof(BOOL) ); + Bind(port); + + string addr; + char hello[1024]; + int len = sprintf( hello, "%d %u\n", VERSION, bus->GetApplicationPort() ); + + // send broadcast to domain list + while ( !domain.empty() ) + { + // find addr up to separator + int index = domain.find_first_of( ", \t" ); + addr = domain.substr( 0, index ); + domain.erase( 0, addr.length() +1 ); + TRACE("Ivy Broadcasting on %s:%d\n", addr.c_str(), port ); + SendTo( hello, len, port, addr.c_str() ); + } +} +void IvyWatcher::stop() +{ + Close(); +} -- cgit v1.1