Dear Rene, dear Fons
For testing purposes I have changed spyserver.C into a standalone
application (see code fragments below).
Now I have the following questions:
1, TSocket::Recv(..):
If (s->Recv(request) <= 0) then the socket is removed from TMonitor:
However, only (message->What() == 0) means that the connection is
closed.
How should a real application handle the cases:
(what == -1) and (what == -4) ?
2, SpyServer::Run():
Can an infinite loop be used in TApplication::Run() as shown below,
or would it be better to implement a TFileHandler?
However, TMonitor already uses TSocketHandler. Is this sufficient?
3, TFileHandler:
In general, when should a class inherited from TFileHandler be used?
Thank you in advance
Best regards
Christian
----------------------------------
C.h.r.i.s.t.i.a.n S.t.r.a.t.o.w.a
V.i.e.n.n.a, A.u.s.t.r.i.a
//----spyserv.h-----
class SpyServer: public TApplication {
private:
TServerSocket *fServ;
TMonitor *fMon;
TList *fSockets;
public:
SpyServer(int *argc, char **argv);
~SpyServer();
void HandleSocket(TSocket *s);
void Run(Bool_t retrn = kFALSE);
ClassDef(SpyServer,1) //
};
//----spyserv.cxx-----
void SpyServer::HandleSocket(TSocket *s)
{
if (s->IsA() == TServerSocket::Class()) {
TSocket *sock = ((TServerSocket*)s)->Accept();
fMon->Add(sock);
fSockets->Add(sock);
} else {
char request[64];
if (s->Recv(request, sizeof(request)) <= 0) {
fMon->Remove(s);
fSockets->Remove(s);
delete s;
return;
}
}
}
void SpyServer::Run(Bool_t retrn)
{
for (Int_t i = 0; ; i++) {
TSocket *s;
if ((s = fMon->Select(20)) != (TSocket*)-1)
HandleSocket(s);
if (gROOT->IsInterrupted())
break;
}
}
//----spymain.cxx-----
int main(int argc, char **argv)
{
gROOT->SetBatch();
SpyServer *theApp = new SpyServer(&argc, argv);
theApp->Run();
delete theApp;
return 0;
}
This archive was generated by hypermail 2b29 : Sat Jan 04 2003 - 23:50:47 MET