hclientbonj.C: Called by the Bonjour resolver with the host and port to which
#include "TBenchmark.h"
#include "TList.h"
#include "TInetAddress.h"
#include "TSocket.h"
#include "TMessage.h"
#include "TH1.h"
#include "TH2.h"
#include "TRandom.h"
#include "TBonjourBrowser.h"
#include "TBonjourResolver.h"
#include "TBonjourRecord.h"
static Bool_t gEvo = kFALSE;
void ConnectToServer(const TInetAddress *hostb, Int_t port)
{
// Called by the Bonjour resolver with the host and port to which
// we can connect.
// Connect only once...
TBonjourResolver *resolver = (TBonjourResolver*) gTQSender;
TInetAddress host = *hostb;
delete resolver;
printf("ConnectToServer: host = %s, port = %d\n", host.GetHostName(), port);
//--- Here starts original hclient.C code ---
// Open connection to server
TSocket *sock = new TSocket(host.GetHostName(), port);
// Wait till we get the start message
char str[32];
sock->Recv(str, 32);
// server tells us who we are
int idx = !strcmp(str, "go 0") ? 0 : 1;
Float_t messlen = 0;
Float_t cmesslen = 0;
if (idx == 1)
sock->SetCompressionLevel(1);
TH1 *hpx;
if (idx == 0) {
// Create the histogram
hpx = new TH1F("hpx","This is the px distribution",100,-4,4);
hpx->SetFillColor(48); // set nice fillcolor
} else {
hpx = new TH2F("hpxpy","py vs px",40,-4,4,40,-4,4);
}
TMessage::EnableSchemaEvolutionForAll(gEvo);
TMessage mess(kMESS_OBJECT);
//TMessage mess(kMESS_OBJECT | kMESS_ACK);
// Fill histogram randomly
gRandom->SetSeed();
Float_t px, py;
const int kUPDATE = 1000;
for (int i = 0; i < 25000; i++) {
gRandom->Rannor(px,py);
if (idx == 0)
hpx->Fill(px);
else
hpx->Fill(px,py);
if (i && (i%kUPDATE) == 0) {
mess.Reset(); // re-use TMessage object
mess.WriteObject(hpx); // write object in message buffer
sock->Send(mess); // send message
messlen += mess.Length();
cmesslen += mess.CompLength();
}
}
sock->Send("Finished"); // tell server we are finished
if (cmesslen > 0)
printf("Average compression ratio: %g\n", messlen/cmesslen);
gBenchmark->Show("hclient");
// Close the socket
sock->Close();
}
void UpdateBonjourRecords(TList *records)
{
// Browse for Bonjour record of type "_hserv2._tcp." in domain "local.".
// When found, create Bonjour resolver to get host and port of this record.
static Bool_t resolved = kFALSE;
// we can be called multiple times whenever a new server appears
printf("UpdateBonjourRecords (resolved = %s)\n", resolved ? "kTRUE" : "kFALSE");
if (resolved) return;
// Look for _hserv2._tcp. in local. domain and try to resolve it
TBonjourRecord *rec;
TIter next(records);
while ((rec = (TBonjourRecord*) next())) {
if (!strcmp(rec->GetRegisteredType(), "_hserv2._tcp.") &&
!strcmp(rec->GetReplyDomain(), "local.")) {
rec->Print();
TBonjourResolver *resolver = new TBonjourResolver;
resolver->Connect("RecordResolved(TInetAddress*,Int_t)", 0, 0,
"ConnectToServer(TInetAddress*,Int_t)");
resolver->ResolveBonjourRecord(*rec);
resolved = kTRUE;
}
}
}
void hclientbonj(Bool_t evol=kFALSE)
{
// Client program which creates and fills a histogram. Every 1000 fills
// the histogram is send to the server which displays the histogram.
//
// To run this demo do the following:
// - Open three windows
// - Start ROOT in all three windows
// - Execute in the first window: .x hserv.C (or hserv2.C)
// - Execute in the second and third windows: .x hclient.C
// If you want to run the hserv.C on a different host, just change
// "localhost" in the TSocket ctor below to the desired hostname.
//
// The script argument "evol" can be used when using a modified version
// of the script where the clients and server are on systems with
// different versions of ROOT. When evol is set to kTRUE the socket will
// support automatic schema evolution between the client and the server.
//
//Author: Fons Rademakers
gEvo = evol;
gBenchmark->Start("hclient");
TBonjourBrowser *browser = new TBonjourBrowser;
browser->Connect("CurrentBonjourRecordsChanged(TList*)", 0, 0,
"UpdateBonjourRecords(TList*)");
browser->BrowseForServiceType("_hserv2._tcp");
}