summaryrefslogtreecommitdiff
path: root/SDL_Core/src/thirdPartyLibs/MessageBroker/include/mb_tcpserver.hpp
blob: 8ab2ce6a6de7f609b603731adc15e1ea7ec2e625 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
/**
 * \file mb_tcpserver.hpp
 * \brief MessageBroker TCP server.
 * \author AKara
 */

#ifndef MB_TCPSERVER_H
#define MB_TCPSERVER_H

#include <list>
#include <map>

#include "mb_server.hpp"
#include "CMessageBroker.hpp"
#include "CSender.hpp"
#include "websocket_handler.hpp"

#define RECV_BUFFER_LENGTH 4097
#define MAX_RECV_BUFFER_LENGTH 100000
#define MAX_RECV_DATA 4096

/**
 * \namespace NsMessageBroker
 * \brief MessageBroker related functions.
 */ 
namespace NsMessageBroker
{
   /**
   * \class TcpServer
   * \brief MessageBroker TCP server implementation.
   */
   class TcpServer : public Server, public CSender
   {
      public:
         /**
         * \brief Constructor.
         * \param address network address or FQDN to bind
         * \param port local port to bind
         * \param pMessageBroker pointer to MessageBroker
         */
         TcpServer(const std::string& address, uint16_t port, NsMessageBroker::CMessageBroker* pMessageBroker);

         /**
         * \brief Destructor.
         */
         virtual ~TcpServer();

         /**
         * \brief Receive data from the network and process it.
         * \param fd socket descriptor to receive data
         * \return true if message has been correctly received, processed and
         * response sent, false otherwise (mainly send/recv error)
         * \note This method will blocked until data comes.
         */
         virtual bool Recv(int fd);

         /**
         * \brief Send data.
         * \param fd file descriptor of the client TCP socket
         * \param data data to send
         * \return number of bytes sent or -1 if error
         */
         virtual ssize_t Send(int fd, const std::string& data);

         /**
         * \brief Wait message.
         *
         * This function do a select() on the socket and Process() immediately 
         * the message.
         * \param ms millisecond to wait (0 means infinite)
         */
         virtual void WaitMessage(uint32_t ms);

         /**
         * \brief Put the TCP socket in LISTEN state.
         */
         bool Listen() const;

         /**
         * \brief Accept a new client socket.
         * \return -1 if error, 0 otherwise
         */
         bool Accept();

         /**
         * \brief Close listen socket and all client sockets.
         */
         void Close();

         /**
         * \brief Method for thread with WaitMessage.
         */
         void* MethodForThread(void * arg);

      private:
         /**
         * \brief Checks if incoming messages are websocket request.
         * \param fd 
         * \param pReceivingBuffer string receiving buffer pointer
         * \return true if it is a websocket handshake
         */
         bool checkWebSocketHandShake(int fd, std::string* pReceivingBuffer);

         /**
         * \brief Checks if incoming messages are websocket request.
         * \param fd file descriptor of the client TCP socket
         * \return true if it is a websocket
         */
         bool isWebSocket(int fd);

         /**
         * \brief Gets buffer for socket which received data.
         * \param fd socket file descriptor
         */
         std::string* getBufferFor(int fd);
      private:
         /**
         * \brief WebSocket clients fd's list.
         */
         std::list<int> m_WebSocketClients; 

         /**
         * \brief Just accepted clients fd's list.
         */
         std::list<int> m_AcceptedClients; 

         /**
         * \brief Receiving buffers map SocketFd:bufferPointer.
         */
         std::map <int, std::string*> m_receivingBuffers; 

         /**
         * \brief List of disconnected sockets to be purged.
         */
         std::list<int> m_purge;
         
         /**
         * \brief MessageBroker pointer.
         */
         NsMessageBroker::CMessageBroker* mpMessageBroker;
         
         /**
         * \brief WebSocket handler.
         */
         CWebSocketHandler mWebSocketHandler;
   };

} /* namespace NsMessageBroker */

#endif /* MB_TCPSERVER_H */