ClpeSocket.cpp
Go to the documentation of this file.
1 // Implementation of the Socket class.
2 
3 #include "ClpeSocket.h"
4 #include "ClpeGlobalDef.h"
5 #include "string.h"
6 #include <string.h>
7 #include <errno.h>
8 #include <fcntl.h>
9 
10 #define ARRAY_SIZE(a) (sizeof(a) / sizeof((a)[0]))
11 
12 ClpeSocket::ClpeSocket() : m_sock_master(-1), m_sock_slave(-1)
13 {
14  memset(&m_addr, 0, sizeof(m_addr));
15 }
16 
18 {
19  if(is_valid_master())
20  {
22  }
23 
24  if(is_valid_slave())
25  {
27  }
28 }
29 
30 bool ClpeSocket::create(int mcu_id) // master (mcu_id = 0), slave (mcu_id = 1)
31 {
32  int sock_id;
33  sock_id = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP);
34 
35  if(mcu_id == MCU_ID_MASTER)
36  {
37  m_sock_master = sock_id;
38 
39  if(!is_valid_master())
40  {
41  return false;
42  }
43  }
44  else
45  {
46  m_sock_slave = sock_id;
47  if(!is_valid_slave())
48  {
49  return false;
50  }
51  }
52 
53 
54  // TIME_WAIT - argh
55  int on = 1;
56  if(setsockopt(sock_id, SOL_SOCKET, SO_REUSEADDR, (const char*)&on, sizeof(on)) == -1)
57  {
58  return false;
59  }
60 
61  // nagle off
62  int nagleOff = 1;
63  if(setsockopt(sock_id, IPPROTO_TCP, TCP_NODELAY, (const char*)&nagleOff, sizeof(nagleOff)) == -1)
64  {
65  return false;
66  }
67 
68  struct timeval timeout = {20, 0}; /* timeout 20 second */
69 
70 #ifdef SOCKET_CLIENT
71  if(setsockopt(sock_id, SOL_SOCKET, SO_RCVTIMEO, &timeout, sizeof(timeout)) == -1)
72  {
73  return false;
74  }
75 
76  if(setsockopt(sock_id, SOL_SOCKET, SO_SNDTIMEO, &timeout, sizeof(timeout)) == -1)
77  {
78  return false;
79  }
80 #endif
81 
82 #ifdef SOCKET_SERVER
83  if(setsockopt(sock_id, SOL_SOCKET, SO_SNDTIMEO, &timeout, sizeof(timeout)) == -1)
84  {
85  return false;
86  }
87 #endif
88 
89 
90 
91  return true;
92 }
93 
94 
95 bool ClpeSocket::bind(const char *host, const int port, int mcu_id) // master (mcu_id = 0), slave (mcu_id = 1)
96 {
97  int sock_id;
98 
99  if(mcu_id == MCU_ID_MASTER)
100  {
101  if(!is_valid_master())
102  {
103  return false;
104  }
105 
106  sock_id = m_sock_master;
107 
108  }
109  else
110  {
111  if(!is_valid_slave())
112  {
113  return false;
114  }
115 
116  sock_id = m_sock_slave;
117  }
118 
119  m_addr.sin_family = AF_INET;
120  m_addr.sin_addr.s_addr = inet_addr(host);
121  m_addr.sin_port = htons(port);
122 
123  int bind_return = ::bind( sock_id, (struct sockaddr *)&m_addr, sizeof(m_addr));
124 
125  if (bind_return == -1)
126  {
127  return false;
128  }
129 
130  return true;
131 }
132 
133 
134 bool ClpeSocket::listen(int mcu_id) const // master (mcu_id = 0), slave (mcu_id = 1)
135 {
136  int sock_id;
137 
138  if(mcu_id == MCU_ID_MASTER)
139  {
140  if (!is_valid_master())
141  {
142  return false;
143  }
144  sock_id = m_sock_master;
145  }
146  else
147  {
148  if (!is_valid_slave())
149  {
150  return false;
151  }
152  sock_id = m_sock_slave;
153  }
154 
155  int listen_return = ::listen(sock_id, MAXCONNECTIONS);
156 
157  if(listen_return == -1)
158  {
159  return false;
160  }
161 
162  return true;
163 }
164 
165 
166 bool ClpeSocket::accept(ClpeSocket *new_socket, int mcu_id) const // master (mcu_id = 0), slave (mcu_id = 1)
167 {
168  int addr_length = sizeof(m_addr);
169 
170  if(mcu_id == MCU_ID_MASTER)
171  {
172  new_socket->m_sock_master = ::accept(m_sock_master, (sockaddr *)&m_addr, (socklen_t *)&addr_length);
173  if(new_socket->m_sock_master<= 0)
174  {
175  return false;
176  }
177 
178  }
179  else
180  {
181  new_socket->m_sock_slave = ::accept(m_sock_slave, (sockaddr *)&m_addr, (socklen_t *)&addr_length);
182  if(new_socket->m_sock_master<= 0)
183  {
184  return false;
185  }
186  }
187 
188  return true;
189 }
190 
191 
192 bool ClpeSocket::send(unsigned char *s, int mcu_id) const // master (mcu_id = 0), slave (mcu_id = 1)
193 {
194 #ifdef SOCKET_CLIENT
196 #endif
197 #ifdef SOCKET_SERVER
199 #endif
200 
201  int sock_id;
202 
203  if(mcu_id == MCU_ID_MASTER)
204  {
205  sock_id = m_sock_master;
206  }
207  else
208  {
209  sock_id = m_sock_slave;
210  }
211  int status = ::send(sock_id, s, data, MSG_NOSIGNAL);
212  if(status == -1)
213  {
214  return false;
215  }
216  else
217  {
218  return true;
219  }
220 }
221 
222 
223 bool ClpeSocket::recv(unsigned char *s, int mcu_id) const // master (mcu_id = 0), slave (mcu_id = 1)
224 {
225 #ifdef SOCKET_CLIENT
227 #endif
228 #ifdef SOCKET_SERVER
230 #endif
231  unsigned char *buf = (unsigned char*) malloc(data);
232 
233  int sock_id;
234 
235  if(mcu_id == MCU_ID_MASTER)
236  {
237  sock_id = m_sock_master;
238  }
239  else
240  {
241  sock_id = m_sock_slave;
242  }
243 
244  int status = ::recv(sock_id, buf, data, 0);
245 
246  if(status == -1)
247  {
248  return false;
249  }
250  else if(status == 0)
251  {
252  return false;
253  }
254  else
255  {
256  for(int i = 0; i < status; i++)
257  {
258  s[i] = buf[i];
259  }
260 
261  free(buf);
262 
263  return true;
264  }
265 }
266 
267 
268 bool ClpeSocket::connect(const string host, const int port, int mcu_id) // master (mcu_id = 0), slave (mcu_id = 1)
269 {
270  int sock_id;
271 
272 
273  if(mcu_id == MCU_ID_MASTER)
274  {
275  if(!is_valid_master())
276  {
277  return false;
278  }
279  sock_id = m_sock_master;
280  }
281  else
282  {
283  if(!is_valid_slave())
284  {
285  return false;
286  }
287  sock_id = m_sock_slave;
288  }
289 
290  m_addr.sin_family = AF_INET;
291  m_addr.sin_port = htons(port);
292 
293  int status = inet_pton(AF_INET, host.c_str(), &m_addr.sin_addr);
294 
295  if(errno == EAFNOSUPPORT)
296  {
297  return false;
298  }
299 
300  status = ::connect(sock_id, (sockaddr *)&m_addr, sizeof(m_addr));
301 
302  if(status == 0)
303  {
304  return true;
305  }
306  else
307  {
308  return false;
309  }
310 }
311 
312 void ClpeSocket::set_non_blocking(const bool b, int mcu_id) // master (mcu_id = 0), slave (mcu_id = 1)
313 {
314  int opts;
315  int sock_id;
316 
317  if(mcu_id == MCU_ID_MASTER)
318  {
319  sock_id = m_sock_master;
320  }
321  else
322  {
323  sock_id = m_sock_slave;
324  }
325 
326  opts = fcntl(sock_id, F_GETFL);
327 
328  if(opts < 0)
329  {
330  return;
331  }
332 
333  if(b)
334  opts = (opts | O_NONBLOCK);
335  else
336  opts = (opts & ~O_NONBLOCK);
337 
338  fcntl(sock_id, F_SETFL,opts);
339 }
340 
341 void ClpeSocket::close(int mcu_id) // master (mcu_id = 0), slave (mcu_id = 1)
342 {
343  if(mcu_id == MCU_ID_MASTER)
344  {
345  if(is_valid_master())
346  {
348  }
349  }
350  else
351  {
352  if(is_valid_slave())
353  {
355  }
356  }
357 }
ClpeSocket::bind
bool bind(const char *host, const int port, int mcu_id)
Definition: ClpeSocket.cpp:95
ClpeSocket::recv
bool recv(unsigned char *s, int mcu_id) const
Definition: ClpeSocket.cpp:223
ClpeSocket::set_non_blocking
void set_non_blocking(const bool, int mcu_id)
Definition: ClpeSocket.cpp:312
ClpeSocket::is_valid_slave
bool is_valid_slave() const
Definition: ClpeSocket.h:48
ClpeSocket
Definition: ClpeSocket.h:24
ClpeSocket::connect
bool connect(const string host, const int port, int mcu_id)
Definition: ClpeSocket.cpp:268
ClpeSocket::m_sock_slave
int m_sock_slave
Definition: ClpeSocket.h:52
ClpeSocket::~ClpeSocket
virtual ~ClpeSocket()
Definition: ClpeSocket.cpp:17
ClpeGlobalDef.h
MCU_ID_MASTER
#define MCU_ID_MASTER
Definition: ClpeGlobalDef.h:50
ClpeSocket::ClpeSocket
ClpeSocket()
Definition: ClpeSocket.cpp:12
ClpeSocket::close
void close(int mcu_id)
Definition: ClpeSocket.cpp:341
ClpeSocket::accept
bool accept(ClpeSocket *new_socket, int mcu_id) const
Definition: ClpeSocket.cpp:166
ClpeSocket.h
ClpeSocket::is_valid_master
bool is_valid_master() const
Definition: ClpeSocket.h:47
ClpeSocket::m_sock_master
int m_sock_master
Definition: ClpeSocket.h:51
ClpeSocket::listen
bool listen(int mcu_id) const
Definition: ClpeSocket.cpp:134
SOCKET_CMD_TX_PACKET_SIZE_MAX
#define SOCKET_CMD_TX_PACKET_SIZE_MAX
Definition: ClpeGlobalDef.h:44
SOCKET_CMD_RX_PACKET_SIZE_MAX
#define SOCKET_CMD_RX_PACKET_SIZE_MAX
Definition: ClpeGlobalDef.h:48
ClpeSocket::create
bool create(int mcu_id)
Definition: ClpeSocket.cpp:30
ClpeSocket::send
bool send(unsigned char *s, int mcu_id) const
Definition: ClpeSocket.cpp:192
MAXCONNECTIONS
const int MAXCONNECTIONS
Definition: ClpeSocket.h:20
ClpeSocket::m_addr
sockaddr_in m_addr
Definition: ClpeSocket.h:53


clpe_sdk
Author(s): Can-lab Corporation
autogenerated on Wed Oct 12 2022 02:17:28