-
-
Notifications
You must be signed in to change notification settings - Fork 42
Expand file tree
/
Copy pathTcpIoThread.h
More file actions
149 lines (126 loc) · 4.23 KB
/
Copy pathTcpIoThread.h
File metadata and controls
149 lines (126 loc) · 4.23 KB
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
//==============================================================================
//
// TcpIoThread.h
//
// Copyright (C) 2013-2025 Greg Utas
//
// This file is part of the Robust Services Core (RSC).
//
// RSC is free software: you can redistribute it and/or modify it under the
// terms of the Lesser GNU General Public License as published by the Free
// Software Foundation, either version 3 of the License, or (at your option)
// any later version.
//
// RSC is distributed in the hope that it will be useful, but WITHOUT ANY
// WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
// FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
// details.
//
// You should have received a copy of the Lesser GNU General Public License
// along with RSC. If not, see <http://www.gnu.org/licenses/>.
//
#ifndef TCPIOTHREAD_H_INCLUDED
#define TCPIOTHREAD_H_INCLUDED
#include "IoThread.h"
#include <cstddef>
#include "Allocators.h"
#include "Array.h"
#include "NwTypes.h"
#include "SysTypes.h"
namespace NetworkBase
{
class TcpIpService;
}
//------------------------------------------------------------------------------
namespace NetworkBase
{
// I/O thread for TCP-based protocols.
//
class TcpIoThread : public IoThread
{
public:
//> The maximum number of connections allowed on a socket.
//
static const size_t MaxConns;
// Creates a TCP I/O thread, managed by DAEMON, that receives messages
// on PORT on behalf of SERVICE.
//
TcpIoThread
(NodeBase::Daemon* daemon, const TcpIpService* service, ipport_t port);
// Adds SOCKET to the list of sockets when accepting a new connection.
//
bool InsertSocket(SysSocket* socket);
// Overridden to display member variables.
//
void Display(std::ostream& stream,
const std::string& prefix, const NodeBase::Flags& options) const override;
// Overridden for patching.
//
void Patch(sel_t selector, void* arguments) override;
protected:
// Protected to restrict deletion.
//
virtual ~TcpIoThread();
// Overridden to release resources in order to unblock.
//
void Unblock() override;
private:
// Returns the listener socket.
//
SysTcpSocket* Listener() const;
// Ensures that the listener socket (if required) exists upon entering
// the thread or after the listener socket encounters an error. Returns
// false on failure.
//
bool EnsureListener();
// Allocates or replaces the listener socket. Returns true on success.
//
bool AllocateListener();
// Polls the sockets until at least one of them reports an event or
// an error occurs. Returns the result of SysTcpSocket::Poll.
//
NodeBase::word PollSockets();
// Services the socket at curr_.
//
void ServiceSocket();
// Invoked to accept a connection. Clears the PollRead flag if no
// connection request was pending. Returns true if a connection was
// accepted.
//
bool AcceptConn();
// Removes sockets_[index] from the list of sockets. If it contains a
// valid socket, that socket is released. Because the last socket moves
// into the vacated slot, INDEX (used for iteration) is decremented.
//
void EraseSocket(size_t& index);
// Releases resources when exiting or cleaning up the thread.
//
void ReleaseResources();
// Overridden to return a name for the thread.
//
NodeBase::c_string AbbrName() const override;
// Overridden to claim IpBuffers queued for output.
//
void ClaimBlocks() override;
// Overridden to receive TCP messages on PORT.
//
void Enter() override;
// The sockets associated with the port served by this thread. The
// first socket listens for new connections, and each of the others
// handles an individual connection.
//
NodeBase::Array<SysTcpSocket*,
NodeBase::DynamicAllocator<SysTcpSocket*>> sockets_;
// Set if the underlying service accepts connections. If not set,
// a listener socket is not allocated, and sockets_[0] is not used.
//
bool listen_;
// The number of sockets with events that still need to be serviced.
//
NodeBase::word ready_;
// The socket currently being serviced (used to index sockets_).
//
size_t curr_;
};
}
#endif