SocketServer.cpp
Go to the documentation of this file.
1 /****************************************************************************
2 ** Copyright (c) 2001-2014
3 **
4 ** This file is part of the QuickFIX FIX Engine
5 **
6 ** This file may be distributed under the terms of the quickfixengine.org
7 ** license as defined by quickfixengine.org and appearing in the file
8 ** LICENSE included in the packaging of this file.
9 **
10 ** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
11 ** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
12 **
13 ** See http://www.quickfixengine.org/LICENSE for licensing information.
14 **
15 ** Contact ask@quickfixengine.org if any conditions of this licensing are
16 ** not clear to you.
17 **
18 ****************************************************************************/
19 
20 #ifdef _MSC_VER
21 #include "stdafx.h"
22 #else
23 #include "config.h"
24 #endif
25 
26 #include "SocketServer.h"
27 #include "Utility.h"
28 #include "Exceptions.h"
29 #ifndef _MSC_VER
30 #include <unistd.h>
31 #include <sys/ioctl.h>
32 #include <sys/types.h>
33 #include <sys/stat.h>
34 #endif
35 #include <exception>
36 
37 namespace FIX
38 {
40 class ServerWrapper : public SocketMonitor::Strategy
41 {
42 public:
43  ServerWrapper( std::set<int> sockets, SocketServer& server,
44  SocketServer::Strategy& strategy )
45 : m_sockets( sockets ), m_server( server ), m_strategy( strategy ) {}
46 
47 private:
48  void onConnect( SocketMonitor&, int socket )
49  {
50  }
51 
52  void onEvent( SocketMonitor& monitor, int socket )
53  {
54  if( m_sockets.find(socket) != m_sockets.end() )
55  {
56  m_strategy.onConnect( m_server, socket, m_server.accept(socket) );
57  }
58  else
59  {
60  if( !m_strategy.onData( m_server, socket ) )
61  onError( monitor, socket );
62  }
63  }
64 
65  void onWrite( SocketMonitor&, int socket )
66  {
67  m_strategy.onWrite( m_server, socket );
68  }
69 
70  void onError( SocketMonitor& monitor, int socket )
71  {
72  m_strategy.onDisconnect( m_server, socket );
73  monitor.drop( socket );
74  }
75 
76  void onError( SocketMonitor& )
77  {
79  }
80 
81  void onTimeout( SocketMonitor& )
82  {
84  };
85 
86  typedef std::set<int>
87  Sockets;
88 
92 };
93 
94 SocketServer::SocketServer( int timeout )
95 : m_monitor( timeout ) {}
96 
97 int SocketServer::add( int port, bool reuse, bool noDelay,
98  int sendBufSize, int rcvBufSize )
99  throw( SocketException& )
100 {
101  if( m_portToInfo.find(port) != m_portToInfo.end() )
102  return m_portToInfo[port].m_socket;
103 
104  int socket = socket_createAcceptor( port, reuse );
105  if( socket < 0 )
106  throw SocketException();
107  if( noDelay )
108  socket_setsockopt( socket, TCP_NODELAY );
109  if( sendBufSize )
110  socket_setsockopt( socket, SO_SNDBUF, sendBufSize );
111  if( rcvBufSize )
112  socket_setsockopt( socket, SO_RCVBUF, rcvBufSize );
113  m_monitor.addRead( socket );
114 
115  SocketInfo info( socket, port, noDelay, sendBufSize, rcvBufSize );
116  m_socketToInfo[socket] = info;
117  m_portToInfo[port] = info;
118  return socket;
119 }
120 
121 int SocketServer::accept( int socket )
122 {
123  SocketInfo info = m_socketToInfo[socket];
124 
125  int result = socket_accept( socket );
126  if( info.m_noDelay )
127  socket_setsockopt( result, TCP_NODELAY );
128  if( info.m_sendBufSize )
129  socket_setsockopt( result, SO_SNDBUF, info.m_sendBufSize );
130  if( info.m_rcvBufSize )
131  socket_setsockopt( result, SO_RCVBUF, info.m_rcvBufSize );
132  if ( result >= 0 )
133  m_monitor.addConnect( result );
134  return result;
135 }
136 
137 void SocketServer::close()
138 {
139  SocketToInfo::iterator i = m_socketToInfo.begin();
140  for( ; i != m_socketToInfo.end(); ++i )
141  {
142  int s = i->first;
143  socket_close( s );
144  socket_invalidate( s );
145  }
146 }
147 
148 bool SocketServer::block( Strategy& strategy, bool poll, double timeout )
149 {
150  std::set<int> sockets;
151  SocketToInfo::iterator i = m_socketToInfo.begin();
152  for( ; i != m_socketToInfo.end(); ++i )
153  {
154  if( !socket_isValid(i->first) )
155  return false;
156  sockets.insert( i->first );
157  }
158 
159  ServerWrapper wrapper( sockets, *this, strategy );
160  m_monitor.block( wrapper, poll, timeout );
161  return true;
162 }
163 
164 int SocketServer::socketToPort( int socket )
165 {
166  SocketToInfo::iterator find = m_socketToInfo.find( socket );
167  if( find == m_socketToInfo.end() ) return 0;
168  return find->second.m_port;
169 }
170 
171 int SocketServer::portToSocket( int port )
172 {
173  SocketToInfo::iterator find = m_portToInfo.find( port );
174  if( find == m_portToInfo.end() ) return 0;
175  return find->second.m_socket;
176 }
177 }
FIX::SocketServer::m_monitor
SocketMonitor m_monitor
Definition: SocketServer.h:100
FIX::SocketMonitor::block
void block(Strategy &strategy, bool poll=0, double timeout=0.0)
Definition: SocketMonitor.cpp:198
FIX::SocketServer::Strategy::onError
virtual void onError(SocketServer &)=0
FIX::SocketServer::Strategy::onData
virtual bool onData(SocketServer &, int socket)=0
FIX::SocketInfo::m_noDelay
bool m_noDelay
Definition: SocketServer.h:84
FIX::ServerWrapper
Handles events from SocketMonitor for server connections.
Definition: SocketServer.cpp:57
FIX::SocketInfo
Information about listening socket.
Definition: SocketServer.h:55
FIX::ServerWrapper::onConnect
void onConnect(SocketMonitor &, int socket)
Definition: SocketServer.cpp:82
FIX::SocketServer::SocketServer
SocketServer(int timeout=0)
Definition: SocketServer.cpp:111
FIX::SocketException
Socket Error.
Definition: Exceptions.h:262
FIX::socket_setsockopt
int socket_setsockopt(int s, int opt)
Definition: Utility.cpp:225
FIX::ServerWrapper::onTimeout
void onTimeout(SocketMonitor &)
Definition: SocketServer.cpp:115
FIX::ServerWrapper::onWrite
void onWrite(SocketMonitor &, int socket)
Definition: SocketServer.cpp:99
FIX::SocketServer::Strategy::onTimeout
virtual void onTimeout(SocketServer &)
Definition: SocketServer.h:112
FIX::SocketMonitor
Monitors events on a collection of sockets.
Definition: SocketMonitor.h:64
FIX::ServerWrapper::m_strategy
SocketServer::Strategy & m_strategy
Definition: SocketServer.cpp:125
FIX::SocketServer::socketToPort
int socketToPort(int socket)
Definition: SocketServer.cpp:181
FIX::ServerWrapper::Sockets
std::set< int > Sockets
Definition: SocketServer.cpp:118
FIX::SocketServer::block
bool block(Strategy &strategy, bool poll=0, double timeout=0.0)
Definition: SocketServer.cpp:165
FIX::SocketMonitor::addConnect
bool addConnect(int socket)
Definition: SocketMonitor.cpp:82
FIX::SocketServer::Strategy::onDisconnect
virtual void onDisconnect(SocketServer &, int socket)=0
FIX::SocketServer::close
void close()
Definition: SocketServer.cpp:154
FIX::socket_isValid
bool socket_isValid(int socket)
Definition: Utility.cpp:294
FIX::ServerWrapper::m_sockets
Sockets m_sockets
Definition: SocketServer.cpp:123
FIX::SocketServer::portToSocket
int portToSocket(int port)
Definition: SocketServer.cpp:188
FIX::SocketInfo::m_rcvBufSize
int m_rcvBufSize
Definition: SocketServer.h:86
FIX::SocketServer::m_portToInfo
PortToInfo m_portToInfo
Definition: SocketServer.h:99
FIX::SocketInfo::m_sendBufSize
int m_sendBufSize
Definition: SocketServer.h:85
FIX::socket_accept
int socket_accept(int s)
Definition: Utility.cpp:181
FIX::ServerWrapper::onError
void onError(SocketMonitor &monitor, int socket)
Definition: SocketServer.cpp:104
FIX::SocketServer::Strategy::onWrite
virtual void onWrite(SocketServer &, int socket)=0
FIX::ServerWrapper::onEvent
void onEvent(SocketMonitor &monitor, int socket)
Definition: SocketServer.cpp:86
FIX::SocketServer::Strategy::onConnect
virtual void onConnect(SocketServer &, int acceptSocket, int socket)=0
FIX
Definition: Acceptor.cpp:34
FIX::SocketServer::m_socketToInfo
SocketToInfo m_socketToInfo
Definition: SocketServer.h:98
FIX::socket_createAcceptor
int socket_createAcceptor(int port, bool reuse)
Definition: Utility.cpp:137
FIX::socket_invalidate
void socket_invalidate(int &socket)
Definition: Utility.cpp:312
SocketServer.h
FIX::ServerWrapper::ServerWrapper
ServerWrapper(std::set< int > sockets, SocketServer &server, SocketServer::Strategy &strategy)
Definition: SocketServer.cpp:77
FIX::socket_close
void socket_close(int s)
Definition: Utility.cpp:197
FIX::ServerWrapper::m_server
SocketServer & m_server
Definition: SocketServer.cpp:124
FIX::SocketServer::Strategy
Definition: SocketServer.h:103
Exceptions.h
FIX::SocketServer
Listens for and accepts incoming socket connections on a port.
Definition: SocketServer.h:73
Utility.h
FIX::SocketServer::add
int add(int port, bool reuse=false, bool noDelay=false, int sendBufSize=0, int rcvBufSize=0)
Definition: SocketServer.cpp:114
FIX::SocketServer::accept
int accept(int socket)
Definition: SocketServer.cpp:138

Generated on Wed Apr 29 2020 19:41:30 for QuickFIX by doxygen 1.8.17 written by Dimitri van Heesch, © 1997-2001