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


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