ROOT logo
// $Id: UdpPacketTcpClient.cxx 2765 2012-06-09 03:18:56Z matevz $

// Copyright (C) 1999-2008, Matevz Tadel. All rights reserved.
// This file is part of GLED, released under GNU General Public License version 2.
// For the licensing terms see $GLEDSYS/LICENSE or http://www.gnu.org/.

#include "UdpPacketTcpClient.h"
#include "UdpPacketTcpClient.c7"

#include "Stones/SSocket.h"
#include "Stones/SMessage.h"
#include "Stones/SUdpPacket.h"
#include "Gled/Gled.h"
#include "Gled/GThread.h"


// UdpPacketTcpClient

//______________________________________________________________________________
//
// TCP client for UdpPacketProcessor. Can deliver packets to several local
// consumers using GQueueSet.

ClassImp(UdpPacketTcpClient);

//==============================================================================

void UdpPacketTcpClient::_init()
{
  mHost = "localhost";
  mPort = 9940;
  mNRetry = 120;
  mRetryWaitSec = 30;
  bExitOnFailure = false;
  mSocket = 0;
  mListenerThread = 0;
}

UdpPacketTcpClient::UdpPacketTcpClient(const Text_t* n, const Text_t* t) :
  UdpPacketSource(n, t)
{
  _init();
}

UdpPacketTcpClient::~UdpPacketTcpClient()
{}

//==============================================================================

void* UdpPacketTcpClient::tl_ListenLoop(UdpPacketTcpClient* c)
{
  c->ListenLoop();
  return 0;
}

void UdpPacketTcpClient::ListenLoop()
{
  static const Exc_t _eh("UdpPacketTcpClient::ListenLoop ");

  GSelector sel;

entry_point:
  UInt_t n_try = 0;
  while (true)
  {
    mSocket = new SSocket(mHost, mPort);

    if (mSocket->IsValid())
    {
      // printf("%sSocket creation successful, entering listen loop.\n", _eh.Data());
      break;
    }

    ++n_try;
    delete mSocket; mSocket = 0;

    // printf("%sSocket creation failed, n_try=%d, max_n=%d.\n", _eh.Data(), n_try, mNRetry);

    if (n_try >= mNRetry)
    {
      GLensReadHolder _lck(this);
      mListenerThread = 0;
      if (bExitOnFailure)
      {
	Gled::theOne->Exit(2);
      }
      return;
    }

    GTime::SleepMiliSec(1000*mRetryWaitSec);
  }

  sel.fRead.Add(mSocket);

  while (true)
  {
    GThread::CancelOn();
    sel.Select();
    GThread::CancelOff();

    for (GFdSet_i i = sel.fReadOut.begin(); i != sel.fReadOut.end(); ++i)
    {
      SSocket* s = (SSocket*) i->first;
      assert(s == mSocket);

      SMessage *m = SMessage::ReceiveOrReport(s, _eh);
      if (m)
      {
        // printf("Recevied message, buffer_size=%d, type=%u\n", m->BufferSize(), m->What());

        SUdpPacket *p = new SUdpPacket;
        p->NetStreamer(*m);
        delete m;

        // printf("  Msg from %hhu.%hhu.%hhu.%hhu:%hu, len=%hu, N_consumers=%d\n",
        //        p->mAddr[0], p->mAddr[1], p->mAddr[2], p->mAddr[3],
        //        p->mPort, p->mBuffLen, mConsumerSet.GetSetSize());

        mConsumerSet.DeliverToQueues(p);
      }
      else
      {
        if (s->TestBit(TSocket::kBrokenConn))
	{
	  sel.fRead.Remove(mSocket);
	  delete mSocket;
	  mSocket = 0;

	  // printf("%sSocket closed, reentering creation etc.\n", _eh.Data());

	  goto entry_point;
	}
      }
    }
  }
}

void UdpPacketTcpClient::ConnectAndListenLoop()
{
  static const Exc_t _eh("UdpPacketTcpClient::ConnectAndListenLoop ");

  {
    GLensReadHolder _lck(this);
    if (mListenerThread)
      throw _eh + "already running.";

    mListenerThread = new GThread("UdpPacketTcpClient-ListenLoop",
                                  (GThread_foo) tl_ListenLoop, this,
                                  false);
    mListenerThread->SetNice(0);
  }

  mListenerThread->Spawn();
}

void UdpPacketTcpClient::StopListening(Bool_t close_p)
{
  static const Exc_t _eh("UdpPacketTcpClient::StopListening ");

  GThread *thr = 0;
  {
    GLensReadHolder _lck(this);
    if ( ! GThread::IsValidPtr(mListenerThread))
      throw _eh + "not running.";
    thr = mListenerThread;
    GThread::InvalidatePtr(mListenerThread);
  }

  thr->Cancel();
  thr->Join();
  if (close_p)
    mSocket->Close();
  delete mSocket;
  mSocket = 0;

  {
    GLensReadHolder _lck(this);
    mListenerThread = 0;
  }
}

//==============================================================================

void UdpPacketTcpClient::SendMessage()
{
  SMessage msg(666);
  msg << "Hello from HELL!";
  msg.Send(mSocket, true);
}
 UdpPacketTcpClient.cxx:1
 UdpPacketTcpClient.cxx:2
 UdpPacketTcpClient.cxx:3
 UdpPacketTcpClient.cxx:4
 UdpPacketTcpClient.cxx:5
 UdpPacketTcpClient.cxx:6
 UdpPacketTcpClient.cxx:7
 UdpPacketTcpClient.cxx:8
 UdpPacketTcpClient.cxx:9
 UdpPacketTcpClient.cxx:10
 UdpPacketTcpClient.cxx:11
 UdpPacketTcpClient.cxx:12
 UdpPacketTcpClient.cxx:13
 UdpPacketTcpClient.cxx:14
 UdpPacketTcpClient.cxx:15
 UdpPacketTcpClient.cxx:16
 UdpPacketTcpClient.cxx:17
 UdpPacketTcpClient.cxx:18
 UdpPacketTcpClient.cxx:19
 UdpPacketTcpClient.cxx:20
 UdpPacketTcpClient.cxx:21
 UdpPacketTcpClient.cxx:22
 UdpPacketTcpClient.cxx:23
 UdpPacketTcpClient.cxx:24
 UdpPacketTcpClient.cxx:25
 UdpPacketTcpClient.cxx:26
 UdpPacketTcpClient.cxx:27
 UdpPacketTcpClient.cxx:28
 UdpPacketTcpClient.cxx:29
 UdpPacketTcpClient.cxx:30
 UdpPacketTcpClient.cxx:31
 UdpPacketTcpClient.cxx:32
 UdpPacketTcpClient.cxx:33
 UdpPacketTcpClient.cxx:34
 UdpPacketTcpClient.cxx:35
 UdpPacketTcpClient.cxx:36
 UdpPacketTcpClient.cxx:37
 UdpPacketTcpClient.cxx:38
 UdpPacketTcpClient.cxx:39
 UdpPacketTcpClient.cxx:40
 UdpPacketTcpClient.cxx:41
 UdpPacketTcpClient.cxx:42
 UdpPacketTcpClient.cxx:43
 UdpPacketTcpClient.cxx:44
 UdpPacketTcpClient.cxx:45
 UdpPacketTcpClient.cxx:46
 UdpPacketTcpClient.cxx:47
 UdpPacketTcpClient.cxx:48
 UdpPacketTcpClient.cxx:49
 UdpPacketTcpClient.cxx:50
 UdpPacketTcpClient.cxx:51
 UdpPacketTcpClient.cxx:52
 UdpPacketTcpClient.cxx:53
 UdpPacketTcpClient.cxx:54
 UdpPacketTcpClient.cxx:55
 UdpPacketTcpClient.cxx:56
 UdpPacketTcpClient.cxx:57
 UdpPacketTcpClient.cxx:58
 UdpPacketTcpClient.cxx:59
 UdpPacketTcpClient.cxx:60
 UdpPacketTcpClient.cxx:61
 UdpPacketTcpClient.cxx:62
 UdpPacketTcpClient.cxx:63
 UdpPacketTcpClient.cxx:64
 UdpPacketTcpClient.cxx:65
 UdpPacketTcpClient.cxx:66
 UdpPacketTcpClient.cxx:67
 UdpPacketTcpClient.cxx:68
 UdpPacketTcpClient.cxx:69
 UdpPacketTcpClient.cxx:70
 UdpPacketTcpClient.cxx:71
 UdpPacketTcpClient.cxx:72
 UdpPacketTcpClient.cxx:73
 UdpPacketTcpClient.cxx:74
 UdpPacketTcpClient.cxx:75
 UdpPacketTcpClient.cxx:76
 UdpPacketTcpClient.cxx:77
 UdpPacketTcpClient.cxx:78
 UdpPacketTcpClient.cxx:79
 UdpPacketTcpClient.cxx:80
 UdpPacketTcpClient.cxx:81
 UdpPacketTcpClient.cxx:82
 UdpPacketTcpClient.cxx:83
 UdpPacketTcpClient.cxx:84
 UdpPacketTcpClient.cxx:85
 UdpPacketTcpClient.cxx:86
 UdpPacketTcpClient.cxx:87
 UdpPacketTcpClient.cxx:88
 UdpPacketTcpClient.cxx:89
 UdpPacketTcpClient.cxx:90
 UdpPacketTcpClient.cxx:91
 UdpPacketTcpClient.cxx:92
 UdpPacketTcpClient.cxx:93
 UdpPacketTcpClient.cxx:94
 UdpPacketTcpClient.cxx:95
 UdpPacketTcpClient.cxx:96
 UdpPacketTcpClient.cxx:97
 UdpPacketTcpClient.cxx:98
 UdpPacketTcpClient.cxx:99
 UdpPacketTcpClient.cxx:100
 UdpPacketTcpClient.cxx:101
 UdpPacketTcpClient.cxx:102
 UdpPacketTcpClient.cxx:103
 UdpPacketTcpClient.cxx:104
 UdpPacketTcpClient.cxx:105
 UdpPacketTcpClient.cxx:106
 UdpPacketTcpClient.cxx:107
 UdpPacketTcpClient.cxx:108
 UdpPacketTcpClient.cxx:109
 UdpPacketTcpClient.cxx:110
 UdpPacketTcpClient.cxx:111
 UdpPacketTcpClient.cxx:112
 UdpPacketTcpClient.cxx:113
 UdpPacketTcpClient.cxx:114
 UdpPacketTcpClient.cxx:115
 UdpPacketTcpClient.cxx:116
 UdpPacketTcpClient.cxx:117
 UdpPacketTcpClient.cxx:118
 UdpPacketTcpClient.cxx:119
 UdpPacketTcpClient.cxx:120
 UdpPacketTcpClient.cxx:121
 UdpPacketTcpClient.cxx:122
 UdpPacketTcpClient.cxx:123
 UdpPacketTcpClient.cxx:124
 UdpPacketTcpClient.cxx:125
 UdpPacketTcpClient.cxx:126
 UdpPacketTcpClient.cxx:127
 UdpPacketTcpClient.cxx:128
 UdpPacketTcpClient.cxx:129
 UdpPacketTcpClient.cxx:130
 UdpPacketTcpClient.cxx:131
 UdpPacketTcpClient.cxx:132
 UdpPacketTcpClient.cxx:133
 UdpPacketTcpClient.cxx:134
 UdpPacketTcpClient.cxx:135
 UdpPacketTcpClient.cxx:136
 UdpPacketTcpClient.cxx:137
 UdpPacketTcpClient.cxx:138
 UdpPacketTcpClient.cxx:139
 UdpPacketTcpClient.cxx:140
 UdpPacketTcpClient.cxx:141
 UdpPacketTcpClient.cxx:142
 UdpPacketTcpClient.cxx:143
 UdpPacketTcpClient.cxx:144
 UdpPacketTcpClient.cxx:145
 UdpPacketTcpClient.cxx:146
 UdpPacketTcpClient.cxx:147
 UdpPacketTcpClient.cxx:148
 UdpPacketTcpClient.cxx:149
 UdpPacketTcpClient.cxx:150
 UdpPacketTcpClient.cxx:151
 UdpPacketTcpClient.cxx:152
 UdpPacketTcpClient.cxx:153
 UdpPacketTcpClient.cxx:154
 UdpPacketTcpClient.cxx:155
 UdpPacketTcpClient.cxx:156
 UdpPacketTcpClient.cxx:157
 UdpPacketTcpClient.cxx:158
 UdpPacketTcpClient.cxx:159
 UdpPacketTcpClient.cxx:160
 UdpPacketTcpClient.cxx:161
 UdpPacketTcpClient.cxx:162
 UdpPacketTcpClient.cxx:163
 UdpPacketTcpClient.cxx:164
 UdpPacketTcpClient.cxx:165
 UdpPacketTcpClient.cxx:166
 UdpPacketTcpClient.cxx:167
 UdpPacketTcpClient.cxx:168
 UdpPacketTcpClient.cxx:169
 UdpPacketTcpClient.cxx:170
 UdpPacketTcpClient.cxx:171
 UdpPacketTcpClient.cxx:172
 UdpPacketTcpClient.cxx:173
 UdpPacketTcpClient.cxx:174
 UdpPacketTcpClient.cxx:175
 UdpPacketTcpClient.cxx:176
 UdpPacketTcpClient.cxx:177
 UdpPacketTcpClient.cxx:178
 UdpPacketTcpClient.cxx:179
 UdpPacketTcpClient.cxx:180
 UdpPacketTcpClient.cxx:181
 UdpPacketTcpClient.cxx:182
 UdpPacketTcpClient.cxx:183
 UdpPacketTcpClient.cxx:184
 UdpPacketTcpClient.cxx:185
 UdpPacketTcpClient.cxx:186
 UdpPacketTcpClient.cxx:187
 UdpPacketTcpClient.cxx:188
 UdpPacketTcpClient.cxx:189