All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Defines
Public Member Functions | Protected Member Functions
GpCoreTools::TcpServerStream Class Reference

Brief description of class still missing. More...

#include <TcpServerStream.h>

Inheritance diagram for GpCoreTools::TcpServerStream:
GpCoreTools::Stream CrystalfontzServer CubeTcpServer GpsServer LinkServer MasterServer NetServer SystemServer TimeMasterServer

List of all members.

Public Member Functions

virtual void event (short type)
virtual short eventTypes ()
bool listen (uint16_t port, int maxConnections)
void send (const char *bytes, int byteCount)
 TcpServerStream ()

Protected Member Functions

virtual void childDeleted (Stream *client)
const std::list
< TcpClientStream * > & 
clients () const
virtual TcpClientStreamcreateClientStream (int fileDescriptor, const Address &peer)=0

Detailed Description

Brief description of class still missing.

Full description of class still missing


Constructor & Destructor Documentation

Description of constructor still missing

References GpCoreTools::CoreApplication::exit(), GpCoreTools::Stream::fileDescriptor(), GpCoreTools::Stream::setFileDescriptor(), TRACE, and GpCoreTools::Log::write().

{
  TRACE;
  setFileDescriptor(socket(AF_INET, SOCK_STREAM, 0));
  if(fileDescriptor()<=0) {
    Log::write(1, "tcp server socket %s\n", strerror(errno));
    CoreApplication::exit(2);
  }
  int optval=1;
  if(setsockopt(fileDescriptor(),SOL_SOCKET,SO_REUSEADDR,&optval,sizeof(optval)) < 0) {
    Log::write(0, "tcp server reuseaddr: [%i] %s\n", errno, strerror(errno));
    CoreApplication::exit(2);
  }
}

Member Function Documentation

void GpCoreTools::TcpServerStream::childDeleted ( Stream client) [protected, virtual]

Reimplemented from GpCoreTools::Stream.

References TRACE.

{
  TRACE;
  std::list<TcpClientStream *>::iterator it;
  for(it=_clients.begin();it!=_clients.end();it++) {
    if(*it==client) {
      break;
    }
  }
  if(it!=_clients.end()) {
    _clients.erase(it);
  }
}
const std::list<TcpClientStream *>& GpCoreTools::TcpServerStream::clients ( ) const [inline, protected]

Referenced by GpsServer::broadcast(), and NetServer::sendNeighbors().

{return _clients;}
virtual TcpClientStream* GpCoreTools::TcpServerStream::createClientStream ( int  fileDescriptor,
const Address peer 
) [protected, pure virtual]
void GpCoreTools::TcpServerStream::event ( short  type) [virtual]

Implements GpCoreTools::Stream.

References GpCoreTools::EventLoop::addStream(), createClientStream(), GpCoreTools::Stream::fileDescriptor(), GpCoreTools::EventLoop::instance(), GpCoreTools::Stream::setParent(), TRACE, and GpCoreTools::Log::write().

{
  TRACE;
  if(type & POLLIN) {
    sockaddr_in peerAddr;
    socklen_t peerAddrLen=sizeof(sockaddr_in);
    int peerFd=accept(fileDescriptor(), (sockaddr *)&peerAddr, &peerAddrLen);
    if(peerFd>0) {
      Log::write(2, "connection from %s:%hu (socket %i)\n",inet_ntoa(peerAddr.sin_addr), ntohs(peerAddr.sin_port), peerFd);
      TcpClientStream * s=createClientStream(peerFd, peerAddr.sin_addr.s_addr);
      EventLoop::instance()->addStream(s);
      s->setParent(this);
      _clients.push_back(s);
    } else {
      Log::write(1, "%s\n", strerror(errno));
    }
  }
}
virtual short GpCoreTools::TcpServerStream::eventTypes ( ) [inline, virtual]

Implements GpCoreTools::Stream.

{return POLLIN;}
bool GpCoreTools::TcpServerStream::listen ( uint16_t  port,
int  maxConnections 
)

References GpCoreTools::Stream::fileDescriptor(), TRACE, and GpCoreTools::Log::write().

Referenced by main().

{
  TRACE;
  if(fileDescriptor()<=0) return false;
  sockaddr_in addr;
  addr.sin_family=AF_INET;
  addr.sin_port=htons(port);
  addr.sin_addr.s_addr=htonl(INADDR_ANY);
  if(bind(fileDescriptor(), (sockaddr *)&addr, sizeof(sockaddr_in))<0) {
    Log::write(1, "%s\n", strerror(errno));
    return false;
  }
  if(::listen(fileDescriptor(), maxConnections)<0) {
    Log::write(1, "%s\n", strerror(errno));
    return false;
  } else {
    return true;
  }
}
void GpCoreTools::TcpServerStream::send ( const char *  bytes,
int  byteCount 
)

Send the same packet to all connected clients

References TRACE.

Referenced by OkPayload::get(), ErrorPayload::get(), HardVersionPayload::get(), SoftVersionPayload::get(), BatteryPayload::get(), TemperaturePayload::get(), CubeTcpServer::sendState(), FrequencyPayload::sendTCP(), GainsPayload::sendTCP(), and TimeModePayload::sendTCP().

{
  TRACE;
  std::list<TcpClientStream *>::iterator it;
  for(it=_clients.begin();it!=_clients.end();it++) {
    (*it)->buffer()->send(bytes, byteCount);
  }
}

The documentation for this class was generated from the following files:
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Defines