@@ -57,6 +57,10 @@ Last modified: September 24, 2014
57
57
#include " CNetSockLib.h"
58
58
59
59
// #include "util/CUtil_DEF.h"
60
+
61
+ #ifdef _WINDOWS
62
+ #pragma comment(lib, "ws2_32.lib")
63
+ #endif
60
64
// ---------------------------------------------------------------
61
65
62
66
@@ -170,6 +174,261 @@ void CNetSockLib::__release(void) {
170
174
171
175
172
176
177
+ // ! Handle I/O
178
+ // ---------------------------------------------------------------
179
+ CHandleIO::CHandleIO (void ) : TAG (" CHandleIO" ) {
180
+ __LOGT__ ( TAG, " CHandleIO()" );
181
+ }
182
+
183
+ CHandleIO::~CHandleIO (void ) {
184
+ __LOGT__ ( TAG, " ~CHandleIO()" );
185
+ }
186
+
187
+ #ifdef _WINDOWS
188
+ int CHandleIO::write_int (const SOCKET socket, const int val) {
189
+ #else
190
+ int CHandleIO::write_int (const int socket, const int val) {
191
+ #endif
192
+ uint32_t _val = htonl ( val );
193
+ int bytes = send (socket, (char *)&_val, sizeof (_val), 0 );
194
+
195
+ if (bytes <= 0 ) {
196
+ // __LOGT__( TAG, "write_int(): %d\n", bytes );
197
+ return -1 ;
198
+ }
199
+
200
+ return bytes;
201
+ }
202
+
203
+ #ifdef _WINDOWS
204
+ int CHandleIO::write_float (const SOCKET socket, const float val) {
205
+ uint32_t _val = htonf ( val );
206
+ #else
207
+ int CHandleIO::write_float (const int socket, const float val) {
208
+ uint32_t _val = g_UTIL::htonf ( val );
209
+ #endif
210
+ int bytes = send (socket, (char *)&_val, sizeof (_val), 0 );
211
+
212
+ if (bytes <= 0 ) {
213
+ // __LOGT__( TAG, "write_float(): %d\n", bytes );
214
+ return -1 ;
215
+ }
216
+
217
+ return bytes;
218
+ }
219
+
220
+ #ifdef _WINDOWS
221
+ int CHandleIO::write_bool (const SOCKET socket, const unsigned char val) {
222
+ #else
223
+ int CHandleIO::write_bool (const int socket, const unsigned char val) {
224
+ #endif
225
+ unsigned char _val = val;
226
+ int bytes = send (socket, (char *)&_val, sizeof (_val), 0 );
227
+
228
+ if (bytes <= 0 ) {
229
+ // __LOGT__( TAG, "write_bool(): %d\n", bytes );
230
+ return -1 ;
231
+ }
232
+
233
+ return bytes;
234
+ }
235
+
236
+ #ifdef _WINDOWS
237
+ int CHandleIO::write (const SOCKET socket, const unsigned char * buffer, const int len){
238
+ #else
239
+ int CHandleIO::write (const int socket, const unsigned char * buffer, const int len){
240
+ #endif
241
+ int bytes = send (socket, (char *)buffer, len, 0 );
242
+ if (bytes <= 0 ) {
243
+ // __LOGT__( TAG, "write(): %d\n", bytes );
244
+ return -1 ;
245
+ }
246
+
247
+ return bytes;
248
+ }
249
+
250
+ #ifdef _WINDOWS
251
+ int CHandleIO::read_int (const SOCKET socket, int * val) {
252
+ #else
253
+ int CHandleIO::read_int (const int socket, int * val) {
254
+ #endif
255
+ uint32_t _val;
256
+ #ifdef _WINDOWS
257
+ int ret = recv (socket, (char *)&_val, sizeof (_val), MSG_WAITALL);
258
+ #else
259
+ int ret = recv (socket, (char *)&_val, sizeof (_val), 0 );
260
+ #endif
261
+
262
+ *val = (int )ntohl ((uint32_t )_val);
263
+ return ret;
264
+ }
265
+
266
+ #ifdef _WINDOWS
267
+ int CHandleIO::read_float (const SOCKET socket, float * val) {
268
+ #else
269
+ int CHandleIO::read_float (const int socket, float * val) {
270
+ #endif
271
+ uint32_t _val;
272
+ #ifdef _WINDOWS
273
+ int ret = recv (socket, (char *)&_val, sizeof (_val), MSG_WAITALL);
274
+ *val = (float )ntohf ((uint32_t )_val);
275
+ #else
276
+ int ret = recv (socket, (char *)&_val, sizeof (_val), 0 );
277
+ *val = (float )g_UTIL::ntohf ((uint32_t )_val);
278
+ #endif
279
+
280
+ return ret;
281
+ }
282
+
283
+ #ifdef _WINDOWS
284
+ int CHandleIO::read_bool (const SOCKET socket, unsigned char * val) {
285
+ #else
286
+ int CHandleIO::read_bool (const int socket, unsigned char * val) {
287
+ #endif
288
+ unsigned char _val;
289
+ #ifdef _WINDOWS
290
+ int ret = recv (socket, (char *)&_val, sizeof (_val), MSG_WAITALL);
291
+ #else
292
+ int ret = recv (socket, (char *)&_val, sizeof (_val), 0 );
293
+ #endif
294
+
295
+ *val = (unsigned char )_val;
296
+
297
+ return ret;
298
+ }
299
+
300
+ #ifdef _WINDOWS
301
+ int CHandleIO::read (const SOCKET socket, unsigned char * buffer, const int len) {
302
+ #else
303
+ int CHandleIO::read (const int socket, unsigned char * buffer, const int len) {
304
+ #endif
305
+ return read (socket, buffer, len, 0 );
306
+ }
307
+
308
+ #ifdef _WINDOWS
309
+ int CHandleIO::read (const SOCKET socket, unsigned char * buffer, const int len, const int read_len) {
310
+ #else
311
+ int CHandleIO::read (const int socket, unsigned char * buffer, const int len, const int read_len) {
312
+ #endif
313
+ char recv_buffer[1024 ] = { 0 , };
314
+ int recv_bytes = 0 ;
315
+ int recv_bytes_total = 0 ;
316
+
317
+ // memset(recv_buffer, 0x00, sizeof(recv_buffer));
318
+ memset (buffer, 0x00 , len);
319
+
320
+ if (read_len > 0 ) {
321
+ while (read_len > recv_bytes_total) {
322
+ memset (recv_buffer, 0x00 , sizeof (recv_buffer));
323
+
324
+ // recv_bytes = recv(socket, (char*)buffer + recv_bytes_total, read_len, 0);
325
+
326
+ recv_bytes = recv (socket, (char *)buffer + recv_bytes_total, read_len - recv_bytes_total, 0 );
327
+ // recv_bytes = recv(socket, recv_buffer, sizeof(recv_buffer), 0);
328
+
329
+ if (recv_bytes <= 0 ) break ;
330
+ // memcpy(buffer + recv_bytes_total, recv_buffer, recv_bytes);
331
+
332
+ recv_bytes_total += recv_bytes;
333
+ }
334
+ }
335
+ else {
336
+ while (1 ) {
337
+ memset (recv_buffer, 0x00 , sizeof (recv_buffer));
338
+
339
+ // recv_bytes = recv(socket, (char*)buffer + recv_bytes_total, len, 0);
340
+ recv_bytes = recv (socket, recv_buffer, sizeof (recv_buffer), 0 );
341
+
342
+ if (recv_bytes <= 0 ) break ;
343
+ memcpy (buffer + recv_bytes_total, recv_buffer, recv_bytes);
344
+
345
+ recv_bytes_total += recv_bytes;
346
+ }
347
+ }
348
+
349
+ // buffer[recv_bytes_total] = '\0';
350
+
351
+ // __LOGT__( TAG, "read(): total bytes = %d\n", recv_bytes_total );
352
+ // __LOGT__( TAG, "read(): data = %s\n", buffer );
353
+
354
+ return recv_bytes_total;
355
+ }
356
+
357
+
358
+ // ! Handle I/O: Client, Server
359
+ // ---------------------------------------------------------------
360
+ int CAsyncTaskServer::write_int (const int val) {
361
+ return write_int (m_sockfd, val);
362
+ }
363
+
364
+ int CAsyncTaskServer::write_float (const float val) {
365
+ return write_float (m_sockfd, val);
366
+ }
367
+
368
+ int CAsyncTaskServer::write_bool (const unsigned char val) {
369
+ return write_bool (m_sockfd, val);
370
+ }
371
+
372
+ int CAsyncTaskServer::write (const unsigned char * buffer, const int len) {
373
+ return write (m_sockfd, buffer, len);
374
+ }
375
+
376
+ int CAsyncTaskServer::read_int (int * val) {
377
+ return read_int (m_sockfd, val);
378
+ }
379
+
380
+ int CAsyncTaskServer::read_float (float * val) {
381
+ return read_float (m_sockfd, val);
382
+ }
383
+
384
+ int CAsyncTaskServer::read_bool (unsigned char * val) {
385
+ return read_bool (m_sockfd, val);
386
+ }
387
+
388
+ int CAsyncTaskServer::read (unsigned char * buffer, const int len) {
389
+ return read (m_sockfd, buffer, len, 0 );
390
+ }
391
+ int CAsyncTaskServer::read (unsigned char * buffer, const int len, const int read_len) {
392
+ return read (m_sockfd, buffer, len, read_len);
393
+ }
394
+
395
+ int CAsyncTaskClient::write_int (const int val) {
396
+ return write_int (m_sockfd, val);
397
+ }
398
+
399
+ int CAsyncTaskClient::write_float (const float val) {
400
+ return write_float (m_sockfd, val);
401
+ }
402
+
403
+ int CAsyncTaskClient::write_bool (const unsigned char val) {
404
+ return write_bool (m_sockfd, val);
405
+ }
406
+
407
+ int CAsyncTaskClient::write (const unsigned char * buffer, const int len) {
408
+ return write (m_sockfd, buffer, len);
409
+ }
410
+
411
+ int CAsyncTaskClient::read_int (int * val) {
412
+ return read_int (m_sockfd, val);
413
+ }
414
+
415
+ int CAsyncTaskClient::read_float (float * val) {
416
+ return read_float (m_sockfd, val);
417
+ }
418
+
419
+ int CAsyncTaskClient::read_bool (unsigned char * val) {
420
+ return read_bool (m_sockfd, val);
421
+ }
422
+
423
+ int CAsyncTaskClient::read (unsigned char * buffer, const int len) {
424
+ return read (m_sockfd, buffer, len, 0 );
425
+ }
426
+ int CAsyncTaskClient::read (unsigned char * buffer, const int len, const int read_len) {
427
+ return read (m_sockfd, buffer, len, read_len);
428
+ }
429
+
430
+
431
+
173
432
// ! Server
174
433
// ---------------------------------------------------------------
175
434
CAsyncTaskServer::CAsyncTaskServer (void ) : CThreadTask (" SERVER" ), TAG (" CAsyncTaskServer" ) {
@@ -193,6 +452,35 @@ CAsyncTaskServer::CAsyncTaskServer(void) : CThreadTask("SERVER"), TAG("CAsyncTas
193
452
CAsyncTaskServer::~CAsyncTaskServer (void ) {
194
453
__LOGT__ ( TAG, " ~CAsyncTaskServer()" );
195
454
455
+ #ifdef __ANDROID_NDK__
456
+ // ! NOTE: Don't use named "__release", which is reserved in NDK
457
+ ___release ();
458
+ #else
459
+ __release ();
460
+ #endif
461
+ }
462
+
463
+ int CAsyncTaskServer::__init (void ) {
464
+ __LOGT__ ( TAG, " __init()" );
465
+ #ifdef _WINDOWS
466
+ WSADATA wsaData;
467
+ int ret = WSAStartup (MAKEWORD (2 , 2 ), &wsaData);
468
+ if (ret != NO_ERROR) {
469
+ __LOGT__ ( TAG, " __init(): Error: WSAStartup(): %d\n " , ret );
470
+ return -1 ;
471
+ }
472
+ #else
473
+ #endif
474
+ }
475
+
476
+ #ifdef __ANDROID_NDK__
477
+ // ! NOTE: Don't use named "__release", which is reserved in NDK
478
+ void CAsyncTaskServer::___release (void ) {
479
+ #else
480
+ void CAsyncTaskServer::__release (void ) {
481
+ #endif
482
+ __LOGT__ ( TAG, " __release()" );
483
+
196
484
server_close ();
197
485
}
198
486
@@ -331,7 +619,11 @@ bool CAsyncTaskServer::server_open_tcp(void) {
331
619
332
620
m_sockfd = socket ( PF_INET, SOCK_STREAM, IPPROTO_TCP );
333
621
if ( m_sockfd < 0 ) {
622
+ #ifdef _WINDOWS
623
+ __LOGT__ ( TAG, " server_open_tcp(): socket(): %ld [FAIL]" , WSAGetLastError () );
624
+ #else
334
625
__LOGT__ ( TAG, " server_open_tcp(): socket() [FAIL]" );
626
+ #endif
335
627
server_close ();
336
628
return false ;
337
629
}
@@ -359,6 +651,19 @@ bool CAsyncTaskServer::server_open_tcp(void) {
359
651
}
360
652
361
653
654
+ #ifdef _WINDOWS
655
+ // blocking mode
656
+ {
657
+ u_long blocking_mode = 0 ;
658
+ ret = ioctlsocket ( m_sockfd, FIONBIO, &blocking_mode );
659
+ if ( ret < 0 ) {
660
+ __LOGT__ ( TAG, " server_open_tcp(): ioctlsocket(): %ld\n " , ret);
661
+ return false ;
662
+ }
663
+ }
664
+ #endif
665
+
666
+
362
667
// Prevent bind error
363
668
ret = setsockopt ( m_sockfd, SOL_SOCKET, SO_REUSEADDR, (char *)&reuse, sizeof (reuse) );
364
669
if ( ret < 0 ) {
@@ -669,6 +974,7 @@ void CAsyncTaskServer::server_close(void) {
669
974
#ifdef _WINDOWS
670
975
:shutdown ( m_sockfd, SD_BOTH );
671
976
::closesocket ( m_sockfd );
977
+ WSACleanup ();
672
978
#else
673
979
shutdown ( m_sockfd, SHUT_RDWR );
674
980
close ( m_sockfd );
@@ -1539,6 +1845,33 @@ namespace g_UTIL {
1539
1845
}
1540
1846
*/
1541
1847
} // namespace NET
1848
+
1849
+ #ifdef _WINDOWS
1850
+ #else
1851
+ // htonf, ntohf
1852
+ // Source: https://beej.us/guide/bgnet/examples/pack.c
1853
+ uint32_t htonf (float f) {
1854
+ uint32_t p;
1855
+ uint32_t sign;
1856
+
1857
+ if (f < 0 ) { sign = 1 ; f = -f; }
1858
+ else { sign = 0 ; }
1859
+
1860
+ p = ((((uint32_t )f) & 0x7fff ) << 16 ) | (sign << 31 ); // whole part and sign
1861
+ p |= (uint32_t )(((f - (int )f) * 65536 .0f )) & 0xffff ; // fraction
1862
+
1863
+ return p;
1864
+ }
1865
+
1866
+ float ntohf (uint32_t p) {
1867
+ float f = ((p >> 16 ) & 0x7fff ); // whole part
1868
+ f += (p & 0xffff ) / 65536 .0f ; // fraction
1869
+
1870
+ if (((p >> 31 ) & 0x1 ) == 0x1 ) { f = -f; } // sign bit set
1871
+
1872
+ return f;
1873
+ }
1874
+ #endif
1542
1875
} // namespace g_UTIL
1543
1876
1544
1877
#ifdef __cplusplus
0 commit comments