18#include <sys/socket.h>
24#include "TServerSocket.h"
25#include "TBufferFile.h"
28#include "TGo4LockGuard.h"
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__));
103 Int_t maxcounter = 0;
121 TGo4Log::Debug(
" Socket: Open(const char *host, Int_t port ) as Client failed ");
157 TGo4Log::Debug(
" Socket: Open(const char *host, Int_t port) as Server failed ");
212 GO4TRACE((12,
"TGo4Socket::Close()", __LINE__, __FILE__));
222 GO4TRACE((12,
"TGo4Socket::SendBuffer( *)", __LINE__, __FILE__));
225 TGo4Log::Debug(
" !!! Socket: SendBuffer() ERROR : no buffer !!! ");
230 TGo4Log::Debug(
" !!! Socket: SendBuffer() ERROR : socket not open !!! ");
235 TGo4Log::Debug(
" !!! Socket: SendBuffer() ERROR : no TSocket !!! ");
240 UInt_t len = buf->Length();
241 char *field = buf->Buffer();
244 TGo4Log::Debug(
" !!! Socket: SendBuffer() ERROR : no data field !!! ");
249 tobuf(temp, (UInt_t)(len -
sizeof(UInt_t)));
261 Int_t rev = gSystem->SendRaw(
fxSocket->GetDescriptor(), field, len, MSG_NOSIGNAL);
263 Int_t rev =
fxSocket->SendRaw(field, len);
275 GO4TRACE((12,
"TGo4Socket::ReceiveBuffer()", __LINE__, __FILE__));
278 TGo4Log::Debug(
" !!! Socket: ReceiveBuffer() ERROR : not open !!! ");
283 TGo4Log::Debug(
" !!! Socket: ReceiveBuffer() ERROR : no TSocket !!! ");
290 Int_t rev = gSystem->RecvRaw(
fxSocket->GetDescriptor(), &len,
sizeof(UInt_t), MSG_NOSIGNAL);
292 Int_t rev =
fxSocket->RecvRaw(&len,
sizeof(UInt_t));
302 Int_t messlen = len +
sizeof(UInt_t);
303 Int_t oldsize =
fxBuffer->BufferSize();
304 Int_t newsize = messlen;
305 if(newsize>oldsize) {
314 char *buf =
fxBuffer->Buffer() +
sizeof(UInt_t);
317 rev = gSystem->RecvRaw(
fxSocket->GetDescriptor(), buf, len, MSG_NOSIGNAL);
319 rev =
fxSocket->RecvRaw((
void *) buf, len);
323 TGo4Log::Debug(
" !!! Socket: ReceiveBuffer() ERROR # %d !!! ",rev);
334 GO4TRACE((12,
"TGo4Socket::Send(TObject *obj)", __LINE__, __FILE__));
340 TMessage mess(kMESS_OBJECT);
343 mess.WriteObject(obj);
361 TGo4Log::Debug(
" !!! Socket: Send(TObject *) ERROR # %d !!! ",rev);
368 GO4TRACE((12,
"TGo4Socket::Send(const char *name)", __LINE__, __FILE__));
396 TGo4Log::Debug(
" !!! Socket: Send(const char *) ERROR # %d !!! ",rev);
404 GO4TRACE((12,
"TGo4Socket::RecvRaw(const char *name)", __LINE__, __FILE__));
407 TGo4Log::Debug(
" !!! Socket: Recv(const char *) ERROR : not open or not active !!! ");
412 TGo4Log::Debug(
" !!! Socket: Recv(const char *) ERROR : no TSocket !!! ");
423 TGo4Log::Debug(
" !!! Socket: RecvRaw(const char *) ERROR # %d !!! ",rev);
434 GO4TRACE((12,
"TGo4Socket::Recv(const char *name)", __LINE__, __FILE__));
436 TObject *obj =
nullptr;
439 TMessage *mess =
nullptr;
446 if (mess->What() == kMESS_OBJECT) {
447 obj = mess->ReadObject(mess->GetClass());
452 TGo4Log::Debug(
" !!! Socket: Recv(TMessage*) ERROR : no TSocket! ");
455 TGo4Log::Debug(
" !!! Socket: Recv(TMessage*) ERROR : not open or not active! ");
465 char *memfield = buffer->Buffer();
473 memfield = TStorage::ReAllocChar(memfield,
474 (newsize+extraspace),
475 (oldsize+extraspace));
476 buffer->ResetBit(TBuffer::kIsOwner);
478 buffer->SetBuffer(memfield, newsize);
480 buffer->SetBit(TBuffer::kIsOwner);
486 buffer->SetBufferOffset(newsize);
static void Debug(const char *text,...) GO4_PRINTF_ARGS
User shortcut for message with prio 0.
static void DisableSigPipe()
static void SetSigWINCH(Bool_t enabled=kTRUE)
Int_t ReceiveBuffer()
Receive raw buffer and fill the internal TBuffer of this socket instance with it.
Bool_t fbOpen
True if connection is open.
TServerSocket * fxServerSocket
Server Socket (server mode only)
static const Int_t fguOPENWAIT
Time to sleep between client open retries.
static const Int_t fgiBUFINITSIZE
Initial size for object receive buffer (TBuffer)
TSocket * fxSocket
root TSocket class doing the work
virtual Int_t Send(TObject *obj)
virtual Int_t Close(Option_t *opt="")
static const Int_t fgiBUFEXTRASPACE
ROOT internal constant: extra space for reallocating object receive buffer (TBuffer)
static const Int_t fgiBUFLENGTH
Raw transport buffer size.
virtual Int_t Open(const char *host, Int_t port, Bool_t keepservsock=kFALSE)
virtual TObject * Recv(const char *name=nullptr)
Bool_t fbClientMode
True if instance runs in as client.
static const char * fgcGOON
First connection string, we are told to go on...
static const Int_t fgiOPENCYCLES
Number of retries for client open.
TBuffer * fxBuffer
aggregation 1
Int_t SendBuffer(TBuffer *buf)
Send raw buffer of external TBuffer object.
Int_t fiPort
Connected port number (of server socket which opened with portnumberscan)
void ReallocBuffer(TBuffer *buffer, Int_t oldsize, Int_t newsize)
Reallocate the fixed input buffer if necessary.
virtual char * RecvRaw(const char *name=nullptr)