win32/net_socket.cpp
Go to the documentation of this file.
1 /*
2  * RoboPeak Project
3  * HAL Layer - Socket Interface
4  * Copyright 2009 - 2013 RoboPeak Project
5  *
6  * Win32 Implementation
7  */
8 
9 #define _WINSOCKAPI_
10 
11 #include "sdkcommon.h"
12 #include "..\..\hal\socket.h"
13 #include <windows.h>
14 #include <winsock2.h>
15 #include <ws2tcpip.h>
16 
17 #include <stdlib.h>
18 #include <stdio.h>
19 #pragma comment (lib, "Ws2_32.lib")
20 
21 namespace rp{ namespace net {
22 
23 static volatile bool _isWSAStartupCalled = false;
24 
25 static inline bool _checkWSAStartup() {
26  int iResult;
27  WSADATA wsaData;
28  if (!_isWSAStartupCalled) {
29  iResult = WSAStartup(MAKEWORD(2,2), &wsaData);
30  if (iResult != 0) {
31  return false;
32  }
33  _isWSAStartupCalled = true;
34  }
35  return true;
36 }
37 
38 static const char* _inet_ntop(int af, const void* src, char* dst, int cnt){
39 
40  struct sockaddr_storage srcaddr;
41 
42 
43  memset(dst, 0, cnt);
44 
45  memset(&srcaddr, 0, sizeof(struct sockaddr_storage));
46 
47 
48  srcaddr.ss_family = af;
49 
50  switch (af) {
51  case AF_INET:
52  {
53  struct sockaddr_in * ipv4 = reinterpret_cast< struct sockaddr_in *>(&srcaddr);
54  memcpy(&(ipv4->sin_addr), src, sizeof(ipv4->sin_addr));
55  }
56  break;
57  case AF_INET6:
58  {
59  struct sockaddr_in6 * ipv6 = reinterpret_cast< struct sockaddr_in6 *>(&srcaddr);
60  memcpy(&(ipv6->sin6_addr), src, sizeof(ipv6->sin6_addr));
61  }
62  break;
63  }
64 
65  if (WSAAddressToStringA((struct sockaddr*) &srcaddr, sizeof(struct sockaddr_storage), 0, dst, (LPDWORD) &cnt) != 0) {
66  DWORD rv = WSAGetLastError();
67  return NULL;
68  }
69  return dst;
70 }
71 
72 static int _inet_pton(int Family, const char * pszAddrString, void* pAddrBuf)
73 {
74  struct sockaddr_storage tmpholder;
75  int actualSize = sizeof(sockaddr_storage);
76 
77  int result = WSAStringToAddressA((char *)pszAddrString, Family, NULL, (sockaddr*)&tmpholder, &actualSize);
78  if (result) return -1;
79 
80  switch (Family) {
81  case AF_INET:
82  {
83  struct sockaddr_in * ipv4 = reinterpret_cast< struct sockaddr_in *>(&tmpholder);
84  memcpy(pAddrBuf, &(ipv4->sin_addr), sizeof(ipv4->sin_addr));
85  }
86  break;
87  case AF_INET6:
88  {
89  struct sockaddr_in6 * ipv6 = reinterpret_cast< struct sockaddr_in6 *>(&tmpholder);
90  memcpy(pAddrBuf, &(ipv6->sin6_addr), sizeof(ipv6->sin6_addr));
91  }
92  break;
93  }
94  return 1;
95 }
96 
98 {
99  switch (type) {
101  return AF_INET;
103  return AF_INET6;
105  return AF_UNSPEC;
106 
107  default:
108  assert(!"should not reach here");
109  return AF_UNSPEC;
110  }
111 }
112 
113 
115 {
117  _platform_data = reinterpret_cast<void *>(new sockaddr_storage);
118  memset(_platform_data, 0, sizeof(sockaddr_storage));
119 
120  reinterpret_cast<sockaddr_storage *>(_platform_data)->ss_family = AF_INET;
121 }
122 
123 SocketAddress::SocketAddress(const SocketAddress & src)
124 {
125  _platform_data = reinterpret_cast<void *>(new sockaddr_storage);
126  memcpy(_platform_data, src._platform_data, sizeof(sockaddr_storage));
127 }
128 
129 
130 
131 SocketAddress::SocketAddress(const char * addrString, int port, SocketAddress::address_type_t type)
132 {
134  _platform_data = reinterpret_cast<void *>(new sockaddr_storage);
135  memset(_platform_data, 0, sizeof(sockaddr_storage));
136 
137  // default to ipv4 in case the following operation fails
138  reinterpret_cast<sockaddr_storage *>(_platform_data)->ss_family = AF_INET;
139 
140  setAddressFromString(addrString, type);
141  setPort(port);
142 }
143 
144 SocketAddress::SocketAddress(void * platform_data)
145  : _platform_data(platform_data)
146 { _checkWSAStartup(); }
147 
148 SocketAddress & SocketAddress::operator = (const SocketAddress &src)
149 {
150  memcpy(_platform_data, src._platform_data, sizeof(sockaddr_storage));
151  return *this;
152 }
153 
154 
155 SocketAddress::~SocketAddress()
156 {
157  delete reinterpret_cast<sockaddr_storage *>(_platform_data);
158 }
159 
160 SocketAddress::address_type_t SocketAddress::getAddressType() const
161 {
162  switch(reinterpret_cast<const sockaddr_storage *>(_platform_data)->ss_family) {
163  case AF_INET:
164  return ADDRESS_TYPE_INET;
165  case AF_INET6:
166  return ADDRESS_TYPE_INET6;
167  default:
168  assert(!"should not reach here");
169  return ADDRESS_TYPE_INET;
170  }
171 }
172 
173 int SocketAddress::getPort() const
174 {
175  switch (getAddressType()) {
176  case ADDRESS_TYPE_INET:
177  return (int)ntohs(reinterpret_cast<const sockaddr_in *>(_platform_data)->sin_port);
178  case ADDRESS_TYPE_INET6:
179  return (int)ntohs(reinterpret_cast<const sockaddr_in6 *>(_platform_data)->sin6_port);
180  default:
181  return 0;
182  }
183 }
184 
185 u_result SocketAddress::setPort(int port)
186 {
187  switch (getAddressType()) {
188  case ADDRESS_TYPE_INET:
189  reinterpret_cast<sockaddr_in *>(_platform_data)->sin_port = htons((short)port);
190  break;
191  case ADDRESS_TYPE_INET6:
192  reinterpret_cast<sockaddr_in6 *>(_platform_data)->sin6_port = htons((short)port);
193  break;
194  default:
195  return RESULT_OPERATION_FAIL;
196  }
197  return RESULT_OK;
198 }
199 
200 u_result SocketAddress::setAddressFromString(const char * address_string, SocketAddress::address_type_t type)
201 {
202  int ans = 0;
203  int prevPort = getPort();
204  switch (type) {
205  case ADDRESS_TYPE_INET:
206  reinterpret_cast<sockaddr_storage *>(_platform_data)->ss_family = AF_INET;
207  ans = _inet_pton(AF_INET,
208  address_string,
209  &reinterpret_cast<sockaddr_in *>(_platform_data)->sin_addr);
210  break;
211 
212 
213  case ADDRESS_TYPE_INET6:
214 
215  reinterpret_cast<sockaddr_storage *>(_platform_data)->ss_family = AF_INET6;
216  ans = _inet_pton(AF_INET6,
217  address_string,
218  &reinterpret_cast<sockaddr_in6 *>(_platform_data)->sin6_addr);
219  break;
220 
221  default:
222  return RESULT_INVALID_DATA;
223 
224  }
225  setPort(prevPort);
226 
227  return ans<=0?RESULT_INVALID_DATA:RESULT_OK;
228 }
229 
230 
231 u_result SocketAddress::getAddressAsString(char * buffer, size_t buffersize) const
232 {
233  int net_family = reinterpret_cast<const sockaddr_storage *>(_platform_data)->ss_family;
234  const char *ans = NULL;
235  switch (net_family) {
236  case AF_INET:
237  ans = _inet_ntop(net_family, &reinterpret_cast<const sockaddr_in *>(_platform_data)->sin_addr,
238  buffer, (int)buffersize);
239  break;
240 
241  case AF_INET6:
242  ans = _inet_ntop(net_family, &reinterpret_cast<const sockaddr_in6 *>(_platform_data)->sin6_addr,
243  buffer, (int)buffersize);
244 
245  break;
246  }
247  return (ans==NULL)?RESULT_OPERATION_FAIL:RESULT_OK;
248 }
249 
250 
251 
252 size_t SocketAddress::LoopUpHostName(const char * hostname, const char * sevicename, std::vector<SocketAddress> &addresspool , bool performDNS, SocketAddress::address_type_t type)
253 {
254  struct addrinfo hints;
255  struct addrinfo *result;
256  int ans;
258  memset(&hints, 0, sizeof(struct addrinfo));
259  hints.ai_family = _halAddrTypeToOSType(type);
260  hints.ai_flags = AI_PASSIVE;
261 
262  if (!performDNS) {
263  hints.ai_family |= AI_NUMERICSERV | AI_NUMERICHOST;
264 
265  }
266 
267  ans = getaddrinfo(hostname, sevicename, &hints, &result);
268 
269  addresspool.clear();
270 
271  if (ans != 0) {
272  // hostname loopup failed
273  return 0;
274  }
275 
276 
277  for (struct addrinfo * cursor = result; cursor != NULL; cursor = cursor->ai_next) {
278  if (cursor->ai_family == ADDRESS_TYPE_INET || cursor->ai_family == ADDRESS_TYPE_INET6) {
279  sockaddr_storage * storagebuffer = new sockaddr_storage;
280  assert(sizeof(sockaddr_storage) >= cursor->ai_addrlen);
281  memcpy(storagebuffer, cursor->ai_addr, cursor->ai_addrlen);
282  addresspool.push_back(SocketAddress(storagebuffer));
283  }
284  }
285 
286 
287  freeaddrinfo(result);
288 
289  return addresspool.size();
290 }
291 
292 
293 u_result SocketAddress::getRawAddress(_u8 * buffer, size_t bufferSize) const
294 {
295  switch (getAddressType()) {
296  case ADDRESS_TYPE_INET:
297  if (bufferSize < sizeof(reinterpret_cast<const sockaddr_in *>(_platform_data)->sin_addr.s_addr)) return RESULT_INSUFFICIENT_MEMORY;
298 
299  memcpy(buffer, &reinterpret_cast<const sockaddr_in *>(_platform_data)->sin_addr.s_addr, sizeof(reinterpret_cast<const sockaddr_in *>(_platform_data)->sin_addr.s_addr));
300 
301 
302  break;
303  case ADDRESS_TYPE_INET6:
304  if (bufferSize < sizeof(reinterpret_cast<const sockaddr_in6 *>(_platform_data)->sin6_addr.s6_addr)) return RESULT_INSUFFICIENT_MEMORY;
305  memcpy(buffer, reinterpret_cast<const sockaddr_in6 *>(_platform_data)->sin6_addr.s6_addr, sizeof(reinterpret_cast<const sockaddr_in6 *>(_platform_data)->sin6_addr.s6_addr));
306 
307  break;
308  default:
309  return RESULT_OPERATION_FAIL;
310  }
311  return RESULT_OK;
312 }
313 
314 
315 void SocketAddress::setLoopbackAddress(SocketAddress::address_type_t type)
316 {
317 
318  int prevPort = getPort();
319  switch (type) {
320  case ADDRESS_TYPE_INET:
321  {
322  sockaddr_in * addrv4 = reinterpret_cast<sockaddr_in *>(_platform_data);
323  addrv4->sin_family = AF_INET;
324  addrv4->sin_addr.s_addr = htonl(INADDR_LOOPBACK);
325  }
326  break;
327  case ADDRESS_TYPE_INET6:
328  {
329  sockaddr_in6 * addrv6 = reinterpret_cast<sockaddr_in6 *>(_platform_data);
330  addrv6->sin6_family = AF_INET6;
331  addrv6->sin6_addr = in6addr_loopback;
332 
333  }
334  break;
335  default:
336  return;
337  }
338 
339  setPort(prevPort);
340 }
341 
342 void SocketAddress::setBroadcastAddressIPv4()
343 {
344 
345  int prevPort = getPort();
346  sockaddr_in * addrv4 = reinterpret_cast<sockaddr_in *>(_platform_data);
347  addrv4->sin_family = AF_INET;
348  addrv4->sin_addr.s_addr = htonl(INADDR_BROADCAST);
349  setPort(prevPort);
350 
351 }
352 
353 void SocketAddress::setAnyAddress(SocketAddress::address_type_t type)
354 {
355  int prevPort = getPort();
356  switch (type) {
357  case ADDRESS_TYPE_INET:
358  {
359  sockaddr_in * addrv4 = reinterpret_cast<sockaddr_in *>(_platform_data);
360  addrv4->sin_family = AF_INET;
361  addrv4->sin_addr.s_addr = htonl(INADDR_ANY);
362  }
363  break;
364  case ADDRESS_TYPE_INET6:
365  {
366  sockaddr_in6 * addrv6 = reinterpret_cast<sockaddr_in6 *>(_platform_data);
367  addrv6->sin6_family = AF_INET6;
368  addrv6->sin6_addr = in6addr_any;
369 
370  }
371  break;
372  default:
373  return;
374  }
375 
376  setPort(prevPort);
377 
378 
379 }
380 
381 
382 }}
383 
384 
385 
387 
388 
389 namespace rp { namespace arch { namespace net{
390 
391 using namespace rp::net;
392 
393 class _single_thread StreamSocketImpl : public StreamSocket
394 {
395 public:
396 
397  StreamSocketImpl(SOCKET fd)
398  : _socket_fd(fd)
399  {
400  assert(fd>=0);
401  int bool_true = 1;
402  ::setsockopt( _socket_fd, SOL_SOCKET, SO_REUSEADDR , (char *)&bool_true, (int)sizeof(bool_true) );
403 
404  enableNoDelay(true);
405  this->setTimeout(DEFAULT_SOCKET_TIMEOUT, SOCKET_DIR_BOTH);
406  }
407 
408  virtual ~StreamSocketImpl()
409  {
410  closesocket(_socket_fd);
411  }
412 
413  virtual void dispose()
414  {
415  delete this;
416  }
417 
418 
419  virtual u_result bind(const SocketAddress & localaddr)
420  {
421  const struct sockaddr * addr = reinterpret_cast<const struct sockaddr *>(localaddr.getPlatformData());
422  assert(addr);
423  int ans = ::bind(_socket_fd, addr, (int)sizeof(sockaddr_storage));
424  if (ans) {
425  return RESULT_OPERATION_FAIL;
426  } else {
427  return RESULT_OK;
428  }
429  }
430 
432  {
433  struct sockaddr * addr = reinterpret_cast<struct sockaddr *>( const_cast<void *>(localaddr.getPlatformData())); //donnot do this at home...
434  assert(addr);
435 
436  int actualsize = sizeof(sockaddr_storage);
437  int ans = ::getsockname(_socket_fd, addr, &actualsize);
438 
439  assert(actualsize <= sizeof(sockaddr_storage));
440  assert(addr->sa_family == AF_INET || addr->sa_family == AF_INET6);
441 
442  return ans?RESULT_OPERATION_FAIL:RESULT_OK;
443  }
444 
446  {
447  int ans;
448  timeval tv;
449  tv.tv_sec = timeout / 1000;
450  tv.tv_usec = (timeout % 1000) * 1000;
451 
452  if (msk & SOCKET_DIR_RD) {
453  ans = ::setsockopt( _socket_fd, SOL_SOCKET, SO_RCVTIMEO, (char *)&tv, (int)sizeof(tv) );
454  if (ans) return RESULT_OPERATION_FAIL;
455  }
456 
457  if (msk & SOCKET_DIR_WR) {
458  ans = ::setsockopt( _socket_fd, SOL_SOCKET, SO_SNDTIMEO, (char *)&tv, (int)sizeof(tv) );
459  if (ans) return RESULT_OPERATION_FAIL;
460  }
461 
462  return RESULT_OK;
463  }
464 
465  virtual u_result connect(const SocketAddress & pairAddress)
466  {
467  u_long mode_block = 0;
468  u_long mode_notBlock = 1;
469 
470  //set to non block mode
471  if (SOCKET_ERROR == ioctlsocket(_socket_fd, (long)FIONBIO, &mode_notBlock))
472  {
473  return RESULT_OPERATION_FAIL;
474  }
475 
476  struct timeval tm;
477  tm.tv_sec = 2;
478  tm.tv_usec = 0;
479  int ret = -1;
480 
481  const struct sockaddr * addr = reinterpret_cast<const struct sockaddr *>(pairAddress.getPlatformData());
482  int ans = ::connect(_socket_fd, addr, (int)sizeof(sockaddr_storage));
483  if (!ans) return RESULT_OK;
484 
485  fd_set set;
486  FD_ZERO(&set);
487  FD_SET(_socket_fd, &set);
488 
489  if (select(-1, NULL, &set, NULL, &tm) <= 0)
490  {
491  ret = -1; // error(select error or timeout)
493  }
494 
495  int error = -1;
496  int optLen = sizeof(int);
497  getsockopt(_socket_fd, SOL_SOCKET, SO_ERROR, (char*)&error, &optLen);
498 
499  if (0 != error)
500  {
501  ret = -1; // error
502  }
503  else
504  {
505  ret = 1; // correct
506  }
507 
508  //set back to block mode
509  if (SOCKET_ERROR == ioctlsocket(_socket_fd, (long)FIONBIO, &mode_block))
510  {
511  return RESULT_OPERATION_FAIL;
512  }
513  if(1 == ret)
514  {
515  return RESULT_OK;
516  }
517  else
518  {
519  return RESULT_OPERATION_FAIL;
520  }
521  }
522 
523  virtual u_result listen(int backlog)
524  {
525  int ans = ::listen( _socket_fd, backlog);
526 
527  return ans?RESULT_OPERATION_FAIL:RESULT_OK;
528  }
529 
530  virtual StreamSocket * accept(SocketAddress * pairAddress)
531  {
532  int addrsize;
533  addrsize = sizeof(sockaddr_storage);
534  SOCKET pair_socket = ::accept( _socket_fd, pairAddress?reinterpret_cast<struct sockaddr *>(const_cast<void *>(pairAddress->getPlatformData())):NULL
535  , &addrsize);
536 
537  if (pair_socket>=0) {
538  return new StreamSocketImpl(pair_socket);
539  } else {
540  return NULL;
541  }
542  }
543 
545  {
546  return waitforData(timeout);
547  }
548 
549  virtual u_result send(const void * buffer, size_t len)
550  {
551  int ans = ::send( _socket_fd, (const char *)buffer, (int)len, 0);
552  if (ans != SOCKET_ERROR ) {
553  assert(ans == (int)len);
554 
555  return RESULT_OK;
556  } else {
557  switch(WSAGetLastError()) {
558  case WSAETIMEDOUT:
560  default:
561  return RESULT_OPERATION_FAIL;
562  }
563 
564  }
565 
566  }
567 
568  virtual u_result recv(void *buf, size_t len, size_t & recv_len)
569  {
570  int ans = ::recv( _socket_fd, (char *)buf, (int)len, 0);
571  //::setsockopt(_socket_fd, IPPROTO_TCP, TCP_QUICKACK, (const char *)1, sizeof(int));
572  //::setsockopt(_socket_fd, IPPROTO_TCP, TCP_QUICKACK, (int[]){1}, sizeof(int))
573  if (ans == SOCKET_ERROR) {
574  recv_len = 0;
575  switch(WSAGetLastError()) {
576  case WSAETIMEDOUT:
578  default:
579  return RESULT_OPERATION_FAIL;
580  }
581  } else {
582  recv_len = ans;
583  return RESULT_OK;
584  }
585  }
586 
588  {
589  struct sockaddr * addr = reinterpret_cast<struct sockaddr *>(const_cast<void *>(peerAddr.getPlatformData())); //donnot do this at home...
590  assert(addr);
591  int actualsize = (int)sizeof(sockaddr_storage);
592  int ans = ::getpeername(_socket_fd, addr, &actualsize);
593 
594  assert(actualsize <= (int)sizeof(sockaddr_storage));
595  assert(addr->sa_family == AF_INET || addr->sa_family == AF_INET6);
596 
597  return ans?RESULT_OPERATION_FAIL:RESULT_OK;
598 
599  }
600 
602  {
603  int shutdw_opt ;
604 
605  switch (mask) {
606  case SOCKET_DIR_RD:
607  shutdw_opt = SD_RECEIVE;
608  break;
609  case SOCKET_DIR_WR:
610  shutdw_opt = SD_SEND;
611  break;
612  case SOCKET_DIR_BOTH:
613  default:
614  shutdw_opt = SD_BOTH;
615  }
616 
617  int ans = ::shutdown(_socket_fd, shutdw_opt);
618  return ans?RESULT_OPERATION_FAIL:RESULT_OK;
619  }
620 
621  virtual u_result enableKeepAlive(bool enable)
622  {
623  int bool_true = enable?1:0;
624  return ::setsockopt( _socket_fd, SOL_SOCKET, SO_KEEPALIVE , (const char *)&bool_true, (int)sizeof(bool_true) )?RESULT_OPERATION_FAIL:RESULT_OK;
625  }
626 
627  virtual u_result enableNoDelay(bool enable )
628  {
629  int bool_true = enable?1:0;
630  return ::setsockopt( _socket_fd, IPPROTO_TCP, TCP_NODELAY, (const char *)&bool_true, (int)sizeof(bool_true) )?RESULT_OPERATION_FAIL:RESULT_OK;
631  }
632 
633  virtual u_result waitforSent(_u32 timeout )
634  {
635  fd_set wrset;
636  FD_ZERO(&wrset);
637  FD_SET(_socket_fd, &wrset);
638 
639  timeval tv;
640  tv.tv_sec = timeout / 1000;
641  tv.tv_usec = (timeout % 1000) * 1000;
642  int ans = ::select(NULL, NULL, &wrset, NULL, &tv);
643 
644  switch (ans) {
645  case 1:
646  // fired
647  return RESULT_OK;
648  case 0:
649  // timeout
651  default:
652  delay(0); //relax cpu
653  return RESULT_OPERATION_FAIL;
654  }
655  }
656 
657  virtual u_result waitforData(_u32 timeout )
658  {
659  fd_set rdset;
660  FD_ZERO(&rdset);
661  FD_SET(_socket_fd, &rdset);
662 
663  timeval tv;
664  tv.tv_sec = timeout / 1000;
665  tv.tv_usec = (timeout % 1000) * 1000;
666  int ans = ::select((int)_socket_fd+1, &rdset, NULL, NULL, &tv);
667 
668  switch (ans) {
669  case 1:
670  // fired
671  return RESULT_OK;
672  case 0:
673  // timeout
675  default:
676  delay(0); //relax cpu
677  return RESULT_OPERATION_FAIL;
678  }
679  }
680 
681 protected:
682 
683  SOCKET _socket_fd;
684 
685 
686 };
687 
688 
690 {
691 public:
692 
693  DGramSocketImpl(SOCKET fd)
694  : _socket_fd(fd)
695  {
696  assert(fd>=0);
697  int bool_true = 1;
698  ::setsockopt( _socket_fd, SOL_SOCKET, SO_REUSEADDR | SO_BROADCAST , (char *)&bool_true, (int)sizeof(bool_true) );
699  setTimeout(DEFAULT_SOCKET_TIMEOUT, SOCKET_DIR_BOTH);
700  }
701 
702  virtual ~DGramSocketImpl()
703  {
704  closesocket(_socket_fd);
705  }
706 
707  virtual void dispose()
708  {
709  delete this;
710  }
711 
712 
713  virtual u_result bind(const SocketAddress & localaddr)
714  {
715  const struct sockaddr * addr = reinterpret_cast<const struct sockaddr *>(localaddr.getPlatformData());
716  assert(addr);
717  int ans = ::bind(_socket_fd, addr, (int)sizeof(sockaddr_storage));
718  if (ans) {
719  return RESULT_OPERATION_FAIL;
720  } else {
721  return RESULT_OK;
722  }
723  }
724 
726  {
727  struct sockaddr * addr = reinterpret_cast<struct sockaddr *>(const_cast<void *>((localaddr.getPlatformData()))); //donnot do this at home...
728  assert(addr);
729 
730  int actualsize = (int)sizeof(sockaddr_storage);
731  int ans = ::getsockname(_socket_fd, addr, &actualsize);
732 
733  assert(actualsize <= (int)sizeof(sockaddr_storage));
734  assert(addr->sa_family == AF_INET || addr->sa_family == AF_INET6);
735 
736  return ans?RESULT_OPERATION_FAIL:RESULT_OK;
737  }
738 
740  {
741  int ans;
742  timeval tv;
743  tv.tv_sec = timeout / 1000;
744  tv.tv_usec = (timeout % 1000) * 1000;
745 
746  if (msk & SOCKET_DIR_RD) {
747  ans = ::setsockopt( _socket_fd, SOL_SOCKET, SO_RCVTIMEO, (const char *)&tv, (int)sizeof(tv) );
748  if (ans) return RESULT_OPERATION_FAIL;
749  }
750 
751  if (msk & SOCKET_DIR_WR) {
752  ans = ::setsockopt( _socket_fd, SOL_SOCKET, SO_SNDTIMEO, (const char *)&tv, (int)sizeof(tv) );
753  if (ans) return RESULT_OPERATION_FAIL;
754  }
755 
756  return RESULT_OK;
757  }
758 
759 
760  virtual u_result waitforSent(_u32 timeout )
761  {
762  fd_set wrset;
763  FD_ZERO(&wrset);
764  FD_SET(_socket_fd, &wrset);
765 
766  timeval tv;
767  tv.tv_sec = timeout / 1000;
768  tv.tv_usec = (timeout % 1000) * 1000;
769  int ans = ::select(NULL, NULL, &wrset, NULL, &tv);
770 
771  switch (ans) {
772  case 1:
773  // fired
774  return RESULT_OK;
775  case 0:
776  // timeout
778  default:
779  delay(0); //relax cpu
780  return RESULT_OPERATION_FAIL;
781  }
782  }
783 
784  virtual u_result waitforData(_u32 timeout )
785  {
786  fd_set rdset;
787  FD_ZERO(&rdset);
788  FD_SET(_socket_fd, &rdset);
789 
790  timeval tv;
791  tv.tv_sec = timeout / 1000;
792  tv.tv_usec = (timeout % 1000) * 1000;
793  int ans = ::select(NULL, &rdset, NULL, NULL, &tv);
794 
795  switch (ans) {
796  case 1:
797  // fired
798  return RESULT_OK;
799  case 0:
800  // timeout
802  default:
803  delay(0); //relax cpu
804  return RESULT_OPERATION_FAIL;
805  }
806  }
807 
808  virtual u_result setPairAddress(const SocketAddress * pairAddress)
809  {
810  sockaddr_storage unspecAddr;
811  unspecAddr.ss_family = AF_UNSPEC;
812 
813  const struct sockaddr * addr = pairAddress ? reinterpret_cast<const struct sockaddr *>(pairAddress->getPlatformData()) : reinterpret_cast<const struct sockaddr *>(&unspecAddr);
814  int ans = ::connect(_socket_fd, addr, (int)sizeof(sockaddr_storage));
815  return ans? RESULT_OPERATION_FAIL: RESULT_OK;
816 
817  }
818 
819  virtual u_result sendTo(const SocketAddress * target, const void * buffer, size_t len)
820  {
821 
822  const struct sockaddr * addr = target?reinterpret_cast<const struct sockaddr *>(target->getPlatformData()): NULL;
823  int dest_addr_size = (target ? sizeof(sockaddr_storage) : 0);
824  int ans = ::sendto( _socket_fd, (const char *)buffer, (int)len, 0, addr, dest_addr_size);
825  if (ans != SOCKET_ERROR) {
826  assert(ans == (int)len);
827  return RESULT_OK;
828  } else {
829  switch(WSAGetLastError()) {
830  case WSAETIMEDOUT:
832  case WSAEMSGSIZE:
833  return RESULT_INVALID_DATA;
834  default:
835  return RESULT_OPERATION_FAIL;
836  }
837  }
838 
839  }
840 
842  {
843  timeval tv;
844  tv.tv_sec = 0;
845  tv.tv_usec = 0;
846  fd_set rdset;
847  FD_ZERO(&rdset);
848  FD_SET(_socket_fd, &rdset);
849 
850  int res = -1;
851  char recv_data[2];
852  memset(recv_data, 0, sizeof(recv_data));
853  while (true) {
854  res = select(FD_SETSIZE, &rdset, nullptr, nullptr, &tv);
855  if (res == 0) break;
856  recv(_socket_fd, recv_data, 1, 0);
857  }
858  return RESULT_OK;
859  }
860 
861 
862  virtual u_result recvFrom(void *buf, size_t len, size_t & recv_len, SocketAddress * sourceAddr)
863  {
864  struct sockaddr * addr = (sourceAddr?reinterpret_cast<struct sockaddr *>(const_cast<void *>(sourceAddr->getPlatformData())):NULL);
865  int source_addr_size = (sourceAddr?sizeof(sockaddr_storage):0);
866 
867  int ans = ::recvfrom( _socket_fd, (char *)buf, (int)len, 0, addr, addr?&source_addr_size:NULL);
868  if (ans == SOCKET_ERROR) {
869  recv_len = 0;
870  int errCode = WSAGetLastError();
871  switch(errCode) {
872  case WSAETIMEDOUT:
874  default:
875  return RESULT_OPERATION_FAIL;
876  }
877  } else {
878  recv_len = ans;
879  return RESULT_OK;
880  }
881 
882  }
883 
884 
885 
886 protected:
887  SOCKET _socket_fd;
888 
889 };
890 
891 
892 }}}
893 
894 
895 namespace rp { namespace net{
896 
897 
898 
900 {
901  switch (family) {
903  return AF_INET;
905  return AF_INET6;
907  return AF_UNSPEC; //win32 doesn't support RAW Packet
908  default:
909  assert(!"should not reach here");
910  return AF_INET; // force treating as IPv4 in release mode
911  }
912 
913 }
914 
916 {
918  if (family == SOCKET_FAMILY_RAW) return NULL;
919 
920 
921  int socket_family = _socketHalFamilyToOSFamily(family);
922  SOCKET socket_fd = ::socket(socket_family, SOCK_STREAM, 0);
923  if (socket_fd == -1) return NULL;
924  StreamSocket * newborn = static_cast<StreamSocket *>(new rp::arch::net::StreamSocketImpl(socket_fd));
925  return newborn;
926 
927 }
928 
929 
931 {
933  int socket_family = _socketHalFamilyToOSFamily(family);
934 
935 
936  SOCKET socket_fd = ::socket(socket_family, (family == SOCKET_FAMILY_RAW) ? SOCK_RAW : SOCK_DGRAM, 0);
937  if (socket_fd == -1) return NULL;
938  DGramSocket * newborn = static_cast<DGramSocket *>(new rp::arch::net::DGramSocketImpl(socket_fd));
939  return newborn;
940 
941 }
942 
943 
944 }}
945 
sdkcommon.h
rp::arch::net::DGramSocketImpl::sendTo
virtual u_result sendTo(const SocketAddress *target, const void *buffer, size_t len)
Definition: win32/net_socket.cpp:819
u_result
uint32_t u_result
Definition: rptypes.h:100
rp::arch::net::StreamSocketImpl::bind
virtual u_result bind(const SocketAddress &localaddr)
Definition: win32/net_socket.cpp:419
rp::arch::net::StreamSocketImpl::send
virtual u_result send(const void *buffer, size_t len)
Definition: win32/net_socket.cpp:549
rp::net::_halAddrTypeToOSType
static int _halAddrTypeToOSType(SocketAddress::address_type_t type)
Definition: linux/net_socket.cpp:29
rp::net::_inet_pton
static int _inet_pton(int Family, const char *pszAddrString, void *pAddrBuf)
Definition: win32/net_socket.cpp:72
rp::arch::net::DGramSocketImpl::recvFrom
virtual u_result recvFrom(void *buf, size_t len, size_t &recv_len, SocketAddress *sourceAddr)
Definition: win32/net_socket.cpp:862
rp::arch::net::StreamSocketImpl::enableNoDelay
virtual u_result enableNoDelay(bool enable)
Definition: win32/net_socket.cpp:627
rp::net::SocketBase::SOCKET_FAMILY_RAW
@ SOCKET_FAMILY_RAW
Definition: socket.h:70
RESULT_INVALID_DATA
#define RESULT_INVALID_DATA
Definition: rptypes.h:105
rp::arch::net::StreamSocketImpl::recv
virtual u_result recv(void *buf, size_t len, size_t &recv_len)
Definition: win32/net_socket.cpp:568
rp::net::StreamSocket
Definition: socket.h:98
rp::net::SocketBase::socket_direction_mask
socket_direction_mask
Definition: socket.h:74
type
sl_u32 type
Definition: sl_lidar_cmd.h:2
getPort
ROSCPP_DECL uint32_t getPort()
rp::net::SocketAddress::SocketAddress
SocketAddress()
Definition: linux/net_socket.cpp:46
rp::net::SocketBase::SOCKET_FAMILY_INET6
@ SOCKET_FAMILY_INET6
Definition: socket.h:69
rp::arch::net::DGramSocketImpl::waitforData
virtual u_result waitforData(_u32 timeout)
Definition: win32/net_socket.cpp:784
rp::net::_socketHalFamilyToOSFamily
static int _socketHalFamilyToOSFamily(SocketBase::socket_family_t family)
Definition: linux/net_socket.cpp:847
RESULT_OK
#define RESULT_OK
Definition: rptypes.h:102
rp::net::_checkWSAStartup
static bool _checkWSAStartup()
Definition: win32/net_socket.cpp:25
rp::arch::net::DGramSocketImpl::DGramSocketImpl
DGramSocketImpl(SOCKET fd)
Definition: win32/net_socket.cpp:693
RESULT_INSUFFICIENT_MEMORY
#define RESULT_INSUFFICIENT_MEMORY
Definition: rptypes.h:111
rp::arch::net::StreamSocketImpl::_socket_fd
SOCKET _socket_fd
Definition: win32/net_socket.cpp:683
rp::net::SocketAddress::ADDRESS_TYPE_INET
@ ADDRESS_TYPE_INET
Definition: socket.h:19
rp::arch::net::DGramSocketImpl::bind
virtual u_result bind(const SocketAddress &localaddr)
Definition: win32/net_socket.cpp:713
rp::arch::net::StreamSocketImpl::getPeerAddress
virtual u_result getPeerAddress(SocketAddress &peerAddr)
Definition: win32/net_socket.cpp:587
rp::arch::net::DGramSocketImpl
Definition: linux/net_socket.cpp:608
_u8
uint8_t _u8
Definition: rptypes.h:63
rp::arch::net::StreamSocketImpl::connect
virtual u_result connect(const SocketAddress &pairAddress)
Definition: win32/net_socket.cpp:465
rp::arch::net::StreamSocketImpl::~StreamSocketImpl
virtual ~StreamSocketImpl()
Definition: win32/net_socket.cpp:408
delay
#define delay(x)
Definition: win32/timer.h:39
rp::arch::net::DGramSocketImpl::clearRxCache
virtual u_result clearRxCache()
Definition: win32/net_socket.cpp:841
rp::net::DGramSocket::CreateSocket
static DGramSocket * CreateSocket(socket_family_t family=SOCKET_FAMILY_INET)
Definition: linux/net_socket.cpp:878
rp::arch::net::DGramSocketImpl::~DGramSocketImpl
virtual ~DGramSocketImpl()
Definition: win32/net_socket.cpp:702
rp::net::_inet_ntop
static const char * _inet_ntop(int af, const void *src, char *dst, int cnt)
Definition: win32/net_socket.cpp:38
rp::net::SocketAddress::setAddressFromString
virtual u_result setAddressFromString(const char *address_string, address_type_t=ADDRESS_TYPE_INET)
Definition: linux/net_socket.cpp:130
_single_thread
#define _single_thread
Definition: types.h:84
result
sl_u32 result
Definition: sl_lidar_cmd.h:3
rp::net::StreamSocket::CreateSocket
static StreamSocket * CreateSocket(socket_family_t family=SOCKET_FAMILY_INET)
Definition: linux/net_socket.cpp:863
rp::net::DGramSocket
Definition: socket.h:131
rp::net::_isWSAStartupCalled
static volatile bool _isWSAStartupCalled
Definition: win32/net_socket.cpp:23
rp::net::SocketAddress::_platform_data
void * _platform_data
Definition: socket.h:59
rp::net::SocketAddress::ADDRESS_TYPE_INET6
@ ADDRESS_TYPE_INET6
Definition: socket.h:20
rp::arch::net::StreamSocketImpl::enableKeepAlive
virtual u_result enableKeepAlive(bool enable)
Definition: win32/net_socket.cpp:621
rp::arch::net::StreamSocketImpl::waitforSent
virtual u_result waitforSent(_u32 timeout)
Definition: win32/net_socket.cpp:633
rp::arch::net::DGramSocketImpl::getLocalAddress
virtual u_result getLocalAddress(SocketAddress &localaddr)
Definition: win32/net_socket.cpp:725
rp::net::SocketAddress::ADDRESS_TYPE_UNSPEC
@ ADDRESS_TYPE_UNSPEC
Definition: socket.h:18
rp::arch::net::DGramSocketImpl::_socket_fd
SOCKET _socket_fd
Definition: win32/net_socket.cpp:887
RESULT_OPERATION_TIMEOUT
#define RESULT_OPERATION_TIMEOUT
Definition: rptypes.h:107
rp::arch::net::StreamSocketImpl::waitforData
virtual u_result waitforData(_u32 timeout)
Definition: win32/net_socket.cpp:657
rp::arch::net::StreamSocketImpl::setTimeout
virtual u_result setTimeout(_u32 timeout, socket_direction_mask msk)
Definition: win32/net_socket.cpp:445
rp::arch::net::StreamSocketImpl::waitforIncomingConnection
virtual u_result waitforIncomingConnection(_u32 timeout)
Definition: win32/net_socket.cpp:544
rp::arch::net::StreamSocketImpl::shutdown
virtual u_result shutdown(socket_direction_mask mask)
Definition: win32/net_socket.cpp:601
rp::arch::net::StreamSocketImpl::getLocalAddress
virtual u_result getLocalAddress(SocketAddress &localaddr)
Definition: win32/net_socket.cpp:431
rp::arch::net::DGramSocketImpl::setPairAddress
virtual u_result setPairAddress(const SocketAddress *pairAddress)
Definition: win32/net_socket.cpp:808
rp::arch::net::DGramSocketImpl::waitforSent
virtual u_result waitforSent(_u32 timeout)
Definition: win32/net_socket.cpp:760
rp::net
Definition: linux/net_socket.cpp:26
set
ROSCPP_DECL void set(const std::string &key, bool b)
RESULT_OPERATION_FAIL
#define RESULT_OPERATION_FAIL
Definition: rptypes.h:106
rp::arch::net::DGramSocketImpl::setTimeout
virtual u_result setTimeout(_u32 timeout, socket_direction_mask msk)
Definition: win32/net_socket.cpp:739
rp::arch::net::StreamSocketImpl
Definition: linux/net_socket.cpp:323
rp::net::SocketAddress::address_type_t
address_type_t
Definition: socket.h:17
rp::net::SocketAddress::getPlatformData
const void * getPlatformData() const
Definition: socket.h:47
rp::net::SocketAddress
Definition: socket.h:13
rp
Definition: rplidar_driver.h:43
rp::arch::net::StreamSocketImpl::StreamSocketImpl
StreamSocketImpl(SOCKET fd)
Definition: win32/net_socket.cpp:397
rp::net::SocketBase::socket_family_t
socket_family_t
Definition: socket.h:67
_u32
uint32_t _u32
Definition: rptypes.h:69
rp::net::SocketBase::SOCKET_FAMILY_INET
@ SOCKET_FAMILY_INET
Definition: socket.h:68
rp::arch::net::StreamSocketImpl::listen
virtual u_result listen(int backlog)
Definition: win32/net_socket.cpp:523
rp::arch::net::DGramSocketImpl::dispose
virtual void dispose()
Definition: win32/net_socket.cpp:707
rp::arch::net::StreamSocketImpl::accept
virtual StreamSocket * accept(SocketAddress *pairAddress)
Definition: win32/net_socket.cpp:530
rp::net::SocketAddress::setPort
virtual u_result setPort(int port)
Definition: linux/net_socket.cpp:115
rp::arch::net::StreamSocketImpl::dispose
virtual void dispose()
Definition: win32/net_socket.cpp:413


rplidar_ros
Author(s):
autogenerated on Fri Aug 2 2024 08:42:14