YARP
Yet Another Robot Platform
TcpStream.h
Go to the documentation of this file.
1 /*
2  * SPDX-FileCopyrightText: 2006-2021 Istituto Italiano di Tecnologia (IIT)
3  * SPDX-FileCopyrightText: 2010 Anne van Rossum <anne@almende.com>
4  * SPDX-License-Identifier: BSD-3-Clause
5  */
6 
7 #ifndef YARP_OS_IMPL_POSIX_TCPSTREAM_H
8 #define YARP_OS_IMPL_POSIX_TCPSTREAM_H
9 
10 // General files
11 #include <sys/types.h>
12 #include <sys/socket.h>
13 #include <netinet/in.h>
14 #include <arpa/inet.h>
15 #include <unistd.h>
16 
17 #include <cstring>
18 
19 namespace yarp {
20 namespace os {
21 namespace impl {
22 namespace posix {
23 
24 
25 /* **************************************************************************************
26  * Interface of TcpStream
27  * **************************************************************************************/
28 
29 
30 class TcpStream
31 {
32 public:
37 
41  virtual ~TcpStream();
42 
43  inline ssize_t recv_n(void *buf, size_t n)
44  {
45  return ::recv(sd, buf, n, 0);
46  }
47 
48  inline ssize_t recv_n(void *buf, size_t n, struct timeval *tv)
49  {
50  setsockopt(sd, SOL_SOCKET, SO_RCVTIMEO, reinterpret_cast<char *>(tv), sizeof (*tv));
51  return ::recv(sd, buf, n, 0);
52  }
53 
54  inline ssize_t recv(void *buf, size_t n)
55  {
56  return ::recv(sd, buf, n, 0);
57  }
58 
59  inline ssize_t recv(void *buf, size_t n, struct timeval *tv)
60  {
61  setsockopt(sd, SOL_SOCKET, SO_RCVTIMEO, reinterpret_cast<char *>(tv), sizeof (*tv));
62  return ::recv(sd, buf, n, 0);
63  }
64 
65  inline ssize_t send_n(const void *buf, size_t n)
66  {
67  return ::send(sd, buf, n, 0);
68  }
69 
70  inline ssize_t send_n(const void *buf, size_t n, struct timeval *tv)
71  {
72  setsockopt(sd, SOL_SOCKET, SO_SNDTIMEO, reinterpret_cast<char *>(tv), sizeof (*tv));
73  return ::send(sd, buf, n, 0);
74  }
75 
76  // No idea what this should do...
77  void flush() { }
78 
79  void close_reader()
80  {
81  if (sd!=-1) {
82  ::shutdown(sd, SHUT_RD);
83  }
84  }
85 
86  void close_writer()
87  {
88  if (sd!=-1) {
89  ::shutdown(sd, SHUT_WR);
90  }
91  }
92 
93  void close()
94  {
95  if (sd!=-1) {
96  ::close(sd);
97  sd = -1;
98  }
99  }
100 
101  int open();
102 
103  int get_local_addr(sockaddr&);
104 
105  int get_remote_addr(sockaddr&);
106 
107  // get stream descriptor
108  int get_handle() { return sd; }
109 
110  // set stream descriptor
111  void set_handle(int h) { sd = h; }
112 
113  // Wrapper around the setsockopt system call.
114  inline int set_option(int level, int option, void *optval, int optlen) const
115  {
116  return setsockopt(sd, level, option, static_cast<char*>(optval), optlen);
117  }
118 
119  // Wrapper around the getsockopt system call.
120  inline int get_option(int level, int option, void *optval, int *optlen) const
121  {
122  return getsockopt(sd, level, option, static_cast<char*>(optval), reinterpret_cast<socklen_t*>(optlen));
123  }
124 private:
125  // stream descriptor
126  int sd {-1};
127 };
128 
129 } // namespace posix
130 } // namespace impl
131 } // namespace os
132 } // namespace yarp
133 
134 #endif // YARP_OS_IMPL_POSIX_TCPSTREAM_H
ssize_t recv(void *buf, size_t n, struct timeval *tv)
Definition: TcpStream.h:59
int set_option(int level, int option, void *optval, int optlen) const
Definition: TcpStream.h:114
ssize_t recv_n(void *buf, size_t n)
Definition: TcpStream.h:43
int get_option(int level, int option, void *optval, int *optlen) const
Definition: TcpStream.h:120
TcpStream()
Constructor TcpStream.
ssize_t send_n(const void *buf, size_t n, struct timeval *tv)
Definition: TcpStream.h:70
virtual ~TcpStream()
Destructor ~TcpStream.
ssize_t recv(void *buf, size_t n)
Definition: TcpStream.h:54
ssize_t recv_n(void *buf, size_t n, struct timeval *tv)
Definition: TcpStream.h:48
ssize_t send_n(const void *buf, size_t n)
Definition: TcpStream.h:65
::ssize_t ssize_t
Definition: numeric.h:86
The main, catch-all namespace for YARP.
Definition: dirs.h:16