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


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