17 #include <sys/types.h>
18 #include <sys/socket.h>
24 #include "TServerSocket.h"
27 #include "TGo4LockGuard.h"
39 fbClientMode(IsClient),
47 GO4TRACE((14,
"TGo4Socket::TGo4Socket(Bool_t)", __LINE__, __FILE__));
66 GO4TRACE((14,
"TGo4Socket::~TGo4Socket()", __LINE__, __FILE__));
94 GO4TRACE((12,
"TGo4Socket::Open(const char* host, Int_t port)", __LINE__, __FILE__));
121 TGo4Log::Debug(
" Socket: Open(const char* host, Int_t port ) as Client failed ");
158 TGo4Log::Debug(
" Socket: Open(const char* host, Int_t port) as Server failed ");
214 GO4TRACE((12,
"TGo4Socket::Close()", __LINE__, __FILE__));
224 GO4TRACE((12,
"TGo4Socket::SendBuffer(TBuffer*)", __LINE__, __FILE__));
227 TGo4Log::Debug(
" !!! Socket: SendBuffer() ERROR : no buffer !!! ");
232 TGo4Log::Debug(
" !!! Socket: SendBuffer() ERROR : socket not open !!! ");
237 TGo4Log::Debug(
" !!! Socket: SendBuffer() ERROR : no TSocket !!! ");
242 UInt_t len = buf->Length();
243 char* field = buf->Buffer();
246 TGo4Log::Debug(
" !!! Socket: SendBuffer() ERROR : no data field !!! ");
251 tobuf(temp, (UInt_t)(len -
sizeof(UInt_t)));
263 Int_t rev = gSystem->SendRaw(
fxSocket->GetDescriptor(), field, len, MSG_NOSIGNAL);
265 Int_t rev =
fxSocket->SendRaw(field, len);
277 GO4TRACE((12,
"TGo4Socket::ReceiveBuffer()", __LINE__, __FILE__));
280 TGo4Log::Debug(
" !!! Socket: ReceiveBuffer() ERROR : not open !!! ");
285 TGo4Log::Debug(
" !!! Socket: ReceiveBuffer() ERROR : no TSocket !!! ");
292 Int_t rev = gSystem->RecvRaw(
fxSocket->GetDescriptor(), &len,
sizeof(UInt_t), MSG_NOSIGNAL);
294 Int_t rev =
fxSocket->RecvRaw(&len,
sizeof(UInt_t));
304 Int_t messlen = len +
sizeof(UInt_t);
307 Int_t oldsize =
fxBuffer->BufferSize();
308 Int_t newsize = messlen;
309 if(newsize>oldsize) {
314 if(newsize < TGo4Socket::fgiBUFINITSIZE)
319 char* buf =
fxBuffer->Buffer()+
sizeof(UInt_t);
322 rev = gSystem->RecvRaw(
fxSocket->GetDescriptor(), buf, len, MSG_NOSIGNAL);
324 rev =
fxSocket->RecvRaw((
void*) buf, len);
328 TGo4Log::Debug(
" !!! Socket: ReceiveBuffer() ERROR # %d !!! ",rev);
340 GO4TRACE((12,
"TGo4Socket::Send(TObject *obj)", __LINE__, __FILE__));
346 TMessage mess(kMESS_OBJECT);
349 mess.WriteObject(obj);
367 TGo4Log::Debug(
" !!! Socket: Send(TObject*) ERROR # %d !!! ",rev);
374 GO4TRACE((12,
"TGo4Socket::Send(const char* name)", __LINE__, __FILE__));
402 TGo4Log::Debug(
" !!! Socket: Send(const char*) ERROR # %d !!! ",rev);
410 GO4TRACE((12,
"TGo4Socket::RecvRaw(const char* name)", __LINE__, __FILE__));
413 TGo4Log::Debug(
" !!! Socket: Recv(const char*) ERROR : not open or not active !!! ");
418 TGo4Log::Debug(
" !!! Socket: Recv(const char*) ERROR : no TSocket !!! ");
429 TGo4Log::Debug(
" !!! Socket: RecvRaw(const char*) ERROR # %d !!! ",rev);
441 GO4TRACE((12,
"TGo4Socket::Recv(const char* name)", __LINE__, __FILE__));
459 if(mess->What() == kMESS_OBJECT)
461 obj = mess->ReadObject(mess->GetClass());
469 TGo4Log::Debug(
" !!! Socket: Recv(TMessage*) ERROR : no TSocket! ");
474 TGo4Log::Debug(
" !!! Socket: Recv(TMessage*) ERROR : not open or not active! ");
482 if(buffer==0)
return;
484 char* memfield = buffer->Buffer();
492 memfield = TStorage::ReAllocChar(memfield,
493 (newsize+extraspace),
494 (oldsize+extraspace));
496 buffer->ResetBit(TBuffer::kIsOwner);
498 buffer->SetBuffer(memfield, newsize);
500 buffer->SetBit(TBuffer::kIsOwner);
506 buffer->SetBufferOffset(newsize);
virtual Int_t Close(Option_t *opt="")
virtual Int_t Send(TObject *obj)
virtual TObject * Recv(const char *name=0)
Int_t SendBuffer(TBuffer *buf)
static const Int_t fgiOPENCYCLES
static const Int_t fguOPENWAIT
TServerSocket * fxServerSocket
virtual Int_t Open(const char *host, Int_t port, Bool_t keepservsock=kFALSE)
static const Int_t fgiBUFLENGTH
static const char * fgcGOON
static const Int_t fgiBUFINITSIZE
void ReallocBuffer(TBuffer *buffer, Int_t oldsize, Int_t newsize)
static void SetSigWINCH(Bool_t enabled=kTRUE)
virtual char * RecvRaw(const char *name=0)
static const Int_t fgiBUFEXTRASPACE
static void Debug(const char *text,...)
static void DisableSigPipe()