@@ -17,27 +17,27 @@ struct ServerInfo {
17
17
class RawSocketSerial {
18
18
public:
19
19
void stop_listen () {
20
- if (SDLNet_TCP_DelSocket (server.socket_set , server.socket ) == -1 ) {
21
- fprintf (stderr, " RawSocketSerial::stop_listen: SDLNet_TCP_DelSocket: %s\n " , SDLNet_GetError ());
22
- exit (-1 );
20
+ if (SDLNet_TCP_DelSocket (server.socket_set , server.socket ) == -1 ) {
21
+ fprintf (stderr, " RawSocketSerial::stop_listen: SDLNet_TCP_DelSocket: %s\n " , SDLNet_GetError ());
22
+ exit (-1 );
23
23
}
24
24
SDLNet_TCP_Close (server.socket );
25
25
26
- for (auto i = 0 ; i < ServerInfo::max_connections; ++i) {
27
- if (server.sockets [i] == nullptr ) continue ;
28
- close_socket (i);
26
+ for (auto i = 0 ; i < ServerInfo::max_connections; ++i) {
27
+ if (server.sockets [i] == nullptr ) continue ;
28
+ close_socket (i);
29
29
}
30
30
}
31
31
32
32
void listen_on_port (uint16_t port) {
33
33
IPaddress ip;
34
- if (SDLNet_ResolveHost (&ip, NULL , port) == -1 ) {
35
- fprintf (stderr, " RawSocketSerial::start: SDLNet_ResolveHost: %s\n " , SDLNet_GetError ());
36
- exit (-1 );
34
+ if (SDLNet_ResolveHost (&ip, NULL , port) == -1 ) {
35
+ fprintf (stderr, " RawSocketSerial::start: SDLNet_ResolveHost: %s\n " , SDLNet_GetError ());
36
+ exit (-1 );
37
37
}
38
38
start_listen (ip);
39
- server_thread = std::thread (&RawSocketSerial::execute, this );
40
39
thread_active = true ;
40
+ server_thread = std::thread (&RawSocketSerial::execute, this );
41
41
}
42
42
43
43
void stop () {
@@ -54,78 +54,79 @@ class RawSocketSerial {
54
54
55
55
void start_listen (IPaddress ip) {
56
56
server.socket = SDLNet_TCP_Open (&ip);
57
- if (server.socket == nullptr ) {
58
- fprintf (stderr, " RawSocketSerial::start_listen: SDLNet_TCP_Open: %s\n " , SDLNet_GetError ());
59
- exit (-1 );
57
+ if (server.socket == nullptr ) {
58
+ fprintf (stderr, " RawSocketSerial::start_listen: SDLNet_TCP_Open: %s\n " , SDLNet_GetError ());
59
+ exit (-1 );
60
60
}
61
61
62
- server.socket_set = SDLNet_AllocSocketSet (server.max_connections + 1 );
63
- if (server.socket_set == nullptr ) {
64
- fprintf (stderr, " RawSocketSerial::start_listen: SDLNet_AllocSocketSet: %s\n " , SDLNet_GetError ());
65
- exit (-1 );
62
+ server.socket_set = SDLNet_AllocSocketSet (server.max_connections + 1 );
63
+ if (server.socket_set == nullptr ) {
64
+ fprintf (stderr, " RawSocketSerial::start_listen: SDLNet_AllocSocketSet: %s\n " , SDLNet_GetError ());
65
+ exit (-1 );
66
66
}
67
67
68
- if (SDLNet_TCP_AddSocket (server.socket_set , server.socket ) == -1 ) {
69
- fprintf (stderr, " RawSocketSerial::start_listen: SDLNet_TCP_AddSocket: %s\n " , SDLNet_GetError ());
70
- exit (-1 );
68
+ if (SDLNet_TCP_AddSocket (server.socket_set , server.socket ) == -1 ) {
69
+ fprintf (stderr, " RawSocketSerial::start_listen: SDLNet_TCP_AddSocket: %s\n " , SDLNet_GetError ());
70
+ exit (-1 );
71
71
}
72
72
}
73
73
74
74
void close_socket (int index) {
75
- if (server.sockets [index ] == nullptr ) {
76
- fprintf (stderr, " RawSocketSerial::close_socket: Attempted to delete a NULL socket.\n " );
77
- return ;
75
+ if (server.sockets [index ] == nullptr ) {
76
+ fprintf (stderr, " RawSocketSerial::close_socket: Attempted to delete a NULL socket.\n " );
77
+ return ;
78
78
}
79
79
80
- if (SDLNet_TCP_DelSocket (server.socket_set , server.sockets [index ]) == -1 ) {
81
- fprintf (stderr, " RawSocketSerial::close_socket: SDLNet_TCP_DelSocket: %s\n " , SDLNet_GetError ());
82
- exit (-1 );
80
+ if (SDLNet_TCP_DelSocket (server.socket_set , server.sockets [index ]) == -1 ) {
81
+ fprintf (stderr, " RawSocketSerial::close_socket: SDLNet_TCP_DelSocket: %s\n " , SDLNet_GetError ());
82
+ exit (-1 );
83
83
}
84
84
85
85
SDLNet_TCP_Close (server.sockets [index ]);
86
86
server.sockets [index ] = nullptr ;
87
87
}
88
88
89
89
int accept_socket (int index) {
90
- if (server.sockets [index ]) {
91
- fprintf (stderr, " RawSocketSerial::accept_socket: Overriding socket at index %d.\n " , index );
92
- close_socket (index );
93
- }
90
+ if (server.sockets [index ]) {
91
+ fprintf (stderr, " RawSocketSerial::accept_socket: Overriding socket at index %d.\n " , index );
92
+ close_socket (index );
93
+ }
94
94
95
- server.sockets [index ] = SDLNet_TCP_Accept (server.socket );
96
- if (server.sockets [index ] == nullptr ) return 0 ;
95
+ server.sockets [index ] = SDLNet_TCP_Accept (server.socket );
96
+ if (server.sockets [index ] == nullptr ) return 0 ;
97
97
98
- if (SDLNet_TCP_AddSocket (server.socket_set , server.sockets [index ]) == -1 ) {
99
- fprintf (stderr, " RawSocketSerial::accept_socket: SDLNet_TCP_AddSocket: %s\n " , SDLNet_GetError ());
100
- exit (-1 );
101
- }
98
+ if (SDLNet_TCP_AddSocket (server.socket_set , server.sockets [index ]) == -1 ) {
99
+ fprintf (stderr, " RawSocketSerial::accept_socket: SDLNet_TCP_AddSocket: %s\n " , SDLNet_GetError ());
100
+ exit (-1 );
101
+ }
102
102
103
- return 1 ;
103
+ return 1 ;
104
104
}
105
105
106
106
int32_t receive (int index) {
107
- int32_t length = SDLNet_TCP_Recv (server.sockets [index ], receive_buffer, ServerInfo::max_packet_size);
108
- if (length <= 0 ) {
109
- close_socket (index );
110
- const char * err = SDLNet_GetError ();
111
- if (strlen (err) == 0 ) {
112
- printf (" RawSocketSerial::receive: client disconnected\n " );
113
- } else {
114
- fprintf (stderr, " RawSocketSerial::receive: SDLNet_TCP_Recv: %s\n " , err);
115
- }
116
- return 0 ;
107
+ int32_t length = SDLNet_TCP_Recv (server.sockets [index ], receive_buffer, ServerInfo::max_packet_size);
108
+ if (length <= 0 ) {
109
+ close_socket (index );
110
+ char const * err = SDLNet_GetError ();
111
+ if (strlen (err) == 0 ) {
112
+ printf (" RawSocketSerial::receive: client disconnected\n " );
117
113
} else {
118
- rx_buffer.write (receive_buffer, length);
119
- return length;
114
+ fprintf (stderr, " RawSocketSerial::receive: SDLNet_TCP_Recv: %s\n " , err);
120
115
}
116
+ return 0 ;
117
+ } else {
118
+ std::scoped_lock buffer_lock (buffer_mutex);
119
+ rx_buffer.write (receive_buffer, length);
120
+ return length;
121
+ }
121
122
}
122
123
123
124
int32_t send (int index) {
124
125
std::size_t length = tx_buffer.read (transmit_buffer, ServerInfo::max_packet_size);
125
- int num_sent = SDLNet_TCP_Send (server.sockets [index ], transmit_buffer, length);
126
- if (num_sent < length) {
127
- fprintf (stderr, " RawSocketSerial::send: SDLNet_TCP_Send: %s\n " , SDLNet_GetError ());
128
- close_socket (index );
126
+ int num_sent = SDLNet_TCP_Send (server.sockets [index ], transmit_buffer, length);
127
+ if (num_sent < length) {
128
+ fprintf (stderr, " RawSocketSerial::send: SDLNet_TCP_Send: %s\n " , SDLNet_GetError ());
129
+ close_socket (index );
129
130
}
130
131
return num_sent;
131
132
}
@@ -144,48 +145,62 @@ class RawSocketSerial {
144
145
145
146
if (SDLNet_SocketReady (server.socket )) {
146
147
int got_socket = accept_socket (server.next_index );
147
- if (!got_socket) {
148
- num_rdy--;
149
- continue ;
148
+ if (!got_socket) {
149
+ num_rdy--;
150
+ continue ;
150
151
}
151
152
152
153
int chk_count = 0 ;
153
154
for (; chk_count < ServerInfo::max_connections; ++chk_count) {
154
- if (server.sockets [(server.next_index + chk_count) % ServerInfo::max_connections] == nullptr ) break ;
155
+ if (server.sockets [(server.next_index + chk_count) % ServerInfo::max_connections] == nullptr ) break ;
155
156
}
156
157
157
158
server.next_index = (server.next_index + chk_count) % ServerInfo::max_connections;
158
159
printf (" RawSocketSerial::thread_main: new connection (server.next_index = %d)\n " , server.next_index );
159
- num_rdy --;
160
+ num_rdy--;
160
161
}
161
162
162
- for (int ind= 0 ; (ind< ServerInfo::max_connections) && num_rdy; ++ind) {
163
+ for (int ind = 0 ; (ind < ServerInfo::max_connections) && num_rdy; ++ind) {
163
164
if (server.sockets [ind] == nullptr ) continue ;
164
165
if (!SDLNet_SocketReady (server.sockets [ind])) continue ;
165
166
receive (ind--);
166
167
}
167
-
168
168
}
169
169
}
170
170
171
- std::size_t available () { return rx_buffer.available (); }
171
+ std::size_t available () {
172
+ return rx_buffer.available ();
173
+ }
172
174
173
175
int16_t read () {
174
176
uint8_t value = 0 ;
175
- uint32_t ret = rx_buffer.read (&value);
177
+ uint32_t ret = rx_buffer.read (&value);
176
178
return (ret ? value : -1 );
177
179
}
178
180
179
- size_t readBytes (char * dst, size_t length) { return rx_buffer.read ((uint8_t *)dst, length); }
180
- size_t write (char c) { return tx_buffer.write (c); }
181
- void write (const char * str) { while (*str) tx_buffer.write (*str++); }
182
- void write (const uint8_t * buffer, size_t size) { tx_buffer.write ((uint8_t *)buffer, size); }
181
+ size_t readBytes (char * dst, size_t length) {
182
+ return rx_buffer.read ((uint8_t *)dst, length);
183
+ }
184
+
185
+ size_t write (char c) {
186
+ return tx_buffer.write (c);
187
+ }
188
+
189
+ void write (char const * str) {
190
+ while (*str)
191
+ tx_buffer.write (*str++);
192
+ }
193
+
194
+ void write (uint8_t const * buffer, size_t size) {
195
+ tx_buffer.write ((uint8_t *)buffer, size);
196
+ }
183
197
184
198
bool thread_active = false ;
185
- ServerInfo server{};
199
+ ServerInfo server {};
186
200
uint8_t receive_buffer[ServerInfo::max_packet_size];
187
201
uint8_t transmit_buffer[ServerInfo::max_packet_size];
188
202
RingBuffer<uint8_t , ServerInfo::max_packet_size> rx_buffer;
189
203
RingBuffer<uint8_t , ServerInfo::max_packet_size> tx_buffer;
190
204
std::thread server_thread;
205
+ std::mutex buffer_mutex {};
191
206
};
0 commit comments