@@ -263,113 +263,123 @@ unsigned short CNetwork::GetUdpBroadcastServerPort()
263
263
return GetUdpServerPort (mUDPBroadcastSocket );
264
264
}
265
265
266
+
266
267
// Receive a data packet. Data is stored in a local static buffer
267
- // Returns number of bytes in received message, 0 on timeout or -1 if there is an error.
268
- int CNetwork::Receive (char * rtDataBuff, int dataBufSize, bool header, int timeout, unsigned int *ipAddr)
268
+ CNetwork::Response CNetwork::Receive (SOCKET socket, SOCKET udpSocket, char * rtDataBuff, int dataBufSize, bool header, int timeoutMicroseconds, unsigned int *ipAddr)
269
269
{
270
- int recieved = 0 ;
270
+ int received = 0 ;
271
271
sockaddr_in source_addr;
272
272
socklen_t fromlen = sizeof (source_addr);
273
273
274
274
fd_set readFDs, exceptFDs;
275
275
FD_ZERO (&readFDs);
276
276
FD_ZERO (&exceptFDs);
277
277
278
- if (mSocket != INVALID_SOCKET)
278
+ if (socket != INVALID_SOCKET)
279
279
{
280
- FD_SET (mSocket , &readFDs);
281
- FD_SET (mSocket , &exceptFDs);
280
+ FD_SET (socket , &readFDs);
281
+ FD_SET (socket , &exceptFDs);
282
282
}
283
- if (mUDPSocket != INVALID_SOCKET)
283
+ if (udpSocket != INVALID_SOCKET)
284
284
{
285
- FD_SET (mUDPSocket , &readFDs);
286
- FD_SET (mUDPSocket , &exceptFDs);
287
- }
288
- if (mUDPBroadcastSocket != INVALID_SOCKET)
289
- {
290
- FD_SET (mUDPBroadcastSocket , &readFDs);
291
- FD_SET (mUDPBroadcastSocket , &exceptFDs);
285
+ FD_SET (udpSocket, &readFDs);
286
+ FD_SET (udpSocket, &exceptFDs);
292
287
}
293
288
294
289
TIMEVAL* pTimeval;
295
290
TIMEVAL sTimeval ;
296
291
297
- if (timeout < 0 )
292
+ if (timeoutMicroseconds < 0 )
298
293
{
299
294
pTimeval = nullptr ;
300
295
}
301
296
else
302
297
{
303
- sTimeval .tv_sec = timeout / 1000000 ;
304
- sTimeval .tv_usec = timeout % 1000000 ;
298
+ sTimeval .tv_sec = timeoutMicroseconds / 1000000 ;
299
+ sTimeval .tv_usec = timeoutMicroseconds % 1000000 ;
305
300
pTimeval = &sTimeval ;
306
301
}
307
302
308
303
#ifdef _WIN32
309
304
const int nfds = 0 ;
310
305
#else
311
- const int nfds = std::max (mSocket , std::max ( mUDPSocket , mUDPBroadcastSocket ) ) + 1 ;
306
+ const int nfds = std::max (socket, udpSocket ) + 1 ;
312
307
#endif
313
308
314
309
// Wait for activity on the TCP and UDP sockets.
315
310
int selectRes = select (nfds, &readFDs, nullptr , &exceptFDs, pTimeval);
311
+
312
+ if (selectRes == SOCKET_ERROR)
313
+ {
314
+ SetErrorString ();
315
+ return Response (CNetwork::ResponseType::error, 0 );
316
+ }
316
317
if (selectRes == 0 )
317
318
{
318
- return 0 ; // Select timeout.
319
+ return Response (CNetwork::ResponseType::timeout, 0 );
319
320
}
320
- if (selectRes > 0 )
321
+
322
+ if (FD_ISSET (socket, &exceptFDs))
321
323
{
322
- if (FD_ISSET (mSocket , &exceptFDs))
324
+ // General socket error
325
+ FD_CLR (socket, &exceptFDs);
326
+ SetErrorString ();
327
+ return Response (CNetwork::ResponseType::error, 0 );
328
+ }
329
+ else if (FD_ISSET (socket, &readFDs))
330
+ {
331
+ received = recv (socket, rtDataBuff, header ? 8 : dataBufSize, 0 );
332
+ FD_CLR (socket, &readFDs);
333
+ if (selectRes == SOCKET_ERROR)
323
334
{
324
- // General socket error
325
- FD_CLR (mSocket , &exceptFDs);
326
335
SetErrorString ();
327
- recieved = SOCKET_ERROR;
328
- }
329
- else if (FD_ISSET (mSocket , &readFDs))
330
- {
331
- recieved = recv (mSocket , rtDataBuff, header ? 8 : dataBufSize, 0 );
332
- FD_CLR (mSocket , &readFDs);
336
+ return Response (CNetwork::ResponseType::error, 0 );
333
337
}
334
- else if (FD_ISSET ( mUDPSocket , &exceptFDs) )
338
+ if (received == 0 )
335
339
{
336
- // General socket error
337
- FD_CLR (mUDPSocket , &exceptFDs);
338
- SetErrorString ();
339
- recieved = SOCKET_ERROR;
340
+ return Response (CNetwork::ResponseType::disconnect, 0 );
340
341
}
341
- else if (FD_ISSET (mUDPSocket , &readFDs))
342
+ return Response (CNetwork::ResponseType::success, received);
343
+ }
344
+ else if (FD_ISSET (udpSocket, &exceptFDs))
345
+ {
346
+ // General socket error
347
+ FD_CLR (udpSocket, &exceptFDs);
348
+ SetErrorString ();
349
+ return Response (CNetwork::ResponseType::error, 0 );
350
+ }
351
+ else if (FD_ISSET (udpSocket, &readFDs))
352
+ {
353
+ received = recvfrom (udpSocket, rtDataBuff, dataBufSize, 0 , (sockaddr*)&source_addr, &fromlen);
354
+ FD_CLR (udpSocket, &readFDs);
355
+ if (ipAddr)
342
356
{
343
- recieved = recvfrom (mUDPSocket , rtDataBuff, dataBufSize, 0 , (sockaddr*)&source_addr, &fromlen);
344
- FD_CLR (mUDPSocket , &readFDs);
357
+ *ipAddr = source_addr.sin_addr .s_addr ;
345
358
}
346
- else if (FD_ISSET ( mUDPBroadcastSocket , &exceptFDs) )
359
+ if (selectRes == SOCKET_ERROR )
347
360
{
348
- // General socket error
349
- FD_CLR (mUDPBroadcastSocket , &exceptFDs);
350
361
SetErrorString ();
351
- recieved = SOCKET_ERROR ;
362
+ return Response (CNetwork::ResponseType::error, 0 ) ;
352
363
}
353
- else if (FD_ISSET ( mUDPBroadcastSocket , &readFDs) )
364
+ if (received == 0 )
354
365
{
355
- recieved = recvfrom (mUDPBroadcastSocket , rtDataBuff, dataBufSize, 0 , (sockaddr*)&source_addr, &fromlen);
356
- FD_CLR (mUDPBroadcastSocket , &readFDs);
357
- if (ipAddr)
358
- {
359
- *ipAddr = source_addr.sin_addr .s_addr ;
360
- }
366
+ return Response (CNetwork::ResponseType::disconnect, 0 );
361
367
}
368
+ return Response (CNetwork::ResponseType::success, received);
362
369
}
363
- else
364
- {
365
- recieved = -1 ;
366
- }
370
+ return Response (CNetwork::ResponseType::error, 0 );
371
+ }
367
372
368
- if (recieved == -1 )
369
- {
370
- SetErrorString ();
371
- }
372
- return recieved;
373
+
374
+ CNetwork::Response CNetwork::Receive (char * rtDataBuff, int dataBufSize, bool header, int timeoutMicroseconds, unsigned int *ipAddr)
375
+ {
376
+ return Receive (mSocket , mUDPSocket , rtDataBuff, dataBufSize, header, timeoutMicroseconds, ipAddr);
377
+ }
378
+
379
+
380
+ CNetwork::Response CNetwork::ReceiveUdpBroadcast (char * rtDataBuff, int dataBufSize, int timeoutMicroseconds, unsigned int *ipAddr)
381
+ {
382
+ return Receive (static_cast <SOCKET>(SOCKET_ERROR), mUDPBroadcastSocket , rtDataBuff, dataBufSize, false , timeoutMicroseconds, ipAddr);
373
383
}
374
384
375
385
0 commit comments