ROOT logo
// $Id: SServerSocket.cxx 2715 2012-04-05 17:25:48Z 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 "SServerSocket.h"

#include "TROOT.h"
#include "TSystem.h"

// SServerSocket

//______________________________________________________________________________
//
// Almost a clone of TServerSocket, differences being:
// - it instantiates and returns a SSocket;
// - authentication a la TServerSocket is not supported.


ClassImp(SServerSocket);

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

SServerSocket::SServerSocket(const char *service, Bool_t reuse, Int_t backlog,
                             Int_t tcpwindowsize)
{
  // Create a server socket object for a named service. Set reuse to true
  // to force reuse of the server socket (i.e. do not wait for the time
  // out to pass). Using backlog one can set the desirable queue length
  // for pending connections.
  // Use tcpwindowsize to specify the size of the receive buffer, it has
  // to be specified here to make sure the window scale option is set (for
  // tcpwindowsize > 65KB and for platforms supporting window scaling).
  // Use IsValid() to check the validity of the
  // server socket. In case server socket is not valid use GetErrorCode()
  // to obtain the specific error value. These values are:
  //  0 = no error (socket is valid)
  // -1 = low level socket() call failed
  // -2 = low level bind() call failed
  // -3 = low level listen() call failed
  // Every valid server socket is added to the TROOT sockets list which
  // will make sure that any open sockets are properly closed on
  // program termination.

  R__ASSERT(gROOT);
  R__ASSERT(gSystem);

  SetName("ServerSocket");

  fSecContext = 0;

  // If this is a local path, try announcing a UNIX socket service
  ResetBit(TSocket::kIsUnix);
  if (service && (!gSystem->AccessPathName(service) ||
#ifndef WIN32
		  service[0] == '/')) {
#else
    service[0] == '/' || (service[1] == ':' && service[2] == '/'))) {
#endif
      SetBit(TSocket::kIsUnix);
      fService = "unix:";
      fService += service;
      fSocket = gSystem->AnnounceUnixService(service, backlog);
      if (fSocket >= 0) {
         R__LOCKGUARD2(gROOTMutex);
         gROOT->GetListOfSockets()->Add(this);
      }
   } else {
      // TCP / UDP socket
      fService = service;
      int port = gSystem->GetServiceByName(service);
      if (port != -1) {
         fSocket = gSystem->AnnounceTcpService(port, reuse, backlog, tcpwindowsize);
         if (fSocket >= 0) {
            R__LOCKGUARD2(gROOTMutex);
            gROOT->GetListOfSockets()->Add(this);
         }
      } else {
         fSocket = -1;
      }
   }
}

//______________________________________________________________________________
SServerSocket::SServerSocket(Int_t port, Bool_t reuse, Int_t backlog,
                             Int_t tcpwindowsize)
{
   // Create a server socket object on a specified port. Set reuse to true
   // to force reuse of the server socket (i.e. do not wait for the time
   // out to pass). Using backlog one can set the desirable queue length
   // for pending connections. If port is 0 a port scan will be done to
   // find a free port. This option is mutual exlusive with the reuse option.
   // Use tcpwindowsize to specify the size of the receive buffer, it has
   // to be specified here to make sure the window scale option is set (for
   // tcpwindowsize > 65KB and for platforms supporting window scaling).
   // Use IsValid() to check the validity of the
   // server socket. In case server socket is not valid use GetErrorCode()
   // to obtain the specific error value. These values are:
   //  0 = no error (socket is valid)
   // -1 = low level socket() call failed
   // -2 = low level bind() call failed
   // -3 = low level listen() call failed
   // Every valid server socket is added to the TROOT sockets list which
   // will make sure that any open sockets are properly closed on
   // program termination.

   R__ASSERT(gROOT);
   R__ASSERT(gSystem);

   SetName("ServerSocket");

   fSecContext = 0;
   fService = gSystem->GetServiceByPort(port);
   SetTitle(fService);

   fSocket = gSystem->AnnounceTcpService(port, reuse, backlog, tcpwindowsize);
   if (fSocket >= 0) {
      R__LOCKGUARD2(gROOTMutex);
      gROOT->GetListOfSockets()->Add(this);
   }
}

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

SSocket *SServerSocket::Accept()
{
  if (fSocket == -1) { return 0; }

  SSocket *socket = new SSocket;

  Int_t soc = gSystem->AcceptConnection(fSocket);
  if (soc == -1) { delete socket; return 0; }
  if (soc == -2) { delete socket; return (SSocket*) -1; }

  socket->fSocket  = soc;
  socket->fSecContext = 0;
  socket->fService = fService;
  if (!TestBit(TSocket::kIsUnix))
    socket->fAddress = gSystem->GetPeerName(socket->fSocket);
  if (socket->fSocket >= 0) {
    R__LOCKGUARD2(gROOTMutex);
    gROOT->GetListOfSockets()->Add(socket);
  }

  return socket;
}

TInetAddress SServerSocket::GetLocalInetAddress()
{
   // Return internet address of host to which the server socket is bound,
   // i.e. the local host. In case of error TInetAddress::IsValid() returns
   // kFALSE.

   if (fSocket != -1) {
      if (fAddress.GetPort() == -1)
         fAddress = gSystem->GetSockName(fSocket);
      return fAddress;
   }
   return TInetAddress();
}

Int_t SServerSocket::GetLocalPort()
{
   // Get port # to which server socket is bound. In case of error returns -1.

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