ViSP  2.6.2
vpNetwork.h
1 /****************************************************************************
2  *
3  * $Id: vpNetwork.h 3820 2012-06-27 13:13:29Z fspindle $
4  *
5  * This file is part of the ViSP software.
6  * Copyright (C) 2005 - 2012 by INRIA. All rights reserved.
7  *
8  * This software is free software; you can redistribute it and/or
9  * modify it under the terms of the GNU General Public License
10  * ("GPL") version 2 as published by the Free Software Foundation.
11  * See the file LICENSE.txt at the root directory of this source
12  * distribution for additional information about the GNU GPL.
13  *
14  * For using ViSP with software that can not be combined with the GNU
15  * GPL, please contact INRIA about acquiring a ViSP Professional
16  * Edition License.
17  *
18  * See http://www.irisa.fr/lagadic/visp/visp.html for more information.
19  *
20  * This software was developed at:
21  * INRIA Rennes - Bretagne Atlantique
22  * Campus Universitaire de Beaulieu
23  * 35042 Rennes Cedex
24  * France
25  * http://www.irisa.fr/lagadic
26  *
27  * If you have questions regarding the use of this file, please contact
28  * INRIA at visp@inria.fr
29  *
30  * This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
31  * WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
32  *
33  *
34  * Description:
35  * TCP Network
36  *
37  * Authors:
38  * Aurelien Yol
39  *
40  *****************************************************************************/
41 
42 #ifndef vpNetwork_H
43 #define vpNetwork_H
44 
45 #include <visp/vpConfig.h>
46 #include <visp/vpRequest.h>
47 
48 #include <vector>
49 #include <stdio.h>
50 #include <string.h>
51 #include <iostream>
52 
53 #ifdef UNIX
54 # include <unistd.h>
55 # include <sys/socket.h>
56 # include <netinet/in.h>
57 # include <arpa/inet.h>
58 # include <netdb.h>
59 #else
60 # include<io.h>
61 //# include<winsock.h>
62 # include<winsock2.h>
63 # pragma comment(lib, "ws2_32.lib")
64 #endif
65 
66 
83 class VISP_EXPORT vpNetwork
84 {
85 protected:
86 
87  struct vpReceptor{
89 #ifdef UNIX
91 #else
92  int receptorAddressSize;
93 #endif
94  struct sockaddr_in receptorAddress;
95  std::string receptorIP;
96  };
97 
98  struct vpEmitter{
99  struct sockaddr_in emitterAdress;
101  };
102 
103  //######## PARAMETERS ########
104  //# #
105  //############################
106 
108  std::vector<vpReceptor> receptor_list;
111 
112  //Message Handling
113  std::vector<vpRequest*> request_list;
114 
115  unsigned int max_size_message;
116  std::string separator;
117  std::string beginning;
118  std::string end;
119  std::string param_sep;
120 
122 
123  struct timeval tv;
124  long tv_sec;
125  long tv_usec;
126 
128 
129 private:
130 
131  std::vector<int> _handleRequests();
132  int _handleFirstRequest();
133 
134  void _receiveRequest();
135  void _receiveRequestFrom(const int &receptorEmitting);
136  int _receiveRequestOnce();
137  int _receiveRequestOnceFrom(const int &receptorEmitting);
138 
139 public:
140 
141  vpNetwork();
142  virtual ~vpNetwork();
143 
144  void addDecodingRequest(vpRequest *);
145 
146  int getReceptorIndex(const char *name);
147 
155  std::string getRequestIdFromIndex(const int &ind){
156  if(ind >= (int)request_list.size() || ind < 0)
157  return "";
158  return request_list[ind]->getId();
159  }
160 
168  unsigned int getMaxSizeReceivedMessage(){ return max_size_message; }
169 
170  virtual void print(const char *id = "");
171 
172  template<typename T>
173  int receive(T* object, const int &sizeOfObject = sizeof(T));
174  template<typename T>
175  int receiveFrom(T* object, const int &receptorEmitting, const int &sizeOfObject = sizeof(T));
176 
177  std::vector<int> receiveRequest();
178  std::vector<int> receiveRequestFrom(const int &receptorEmitting);
179  int receiveRequestOnce();
180  int receiveRequestOnceFrom(const int &receptorEmitting);
181 
182  std::vector<int> receiveAndDecodeRequest();
183  std::vector<int> receiveAndDecodeRequestFrom(const int &receptorEmitting);
184  int receiveAndDecodeRequestOnce();
185  int receiveAndDecodeRequestOnceFrom(const int &receptorEmitting);
186 
187  void removeDecodingRequest(const char *);
188 
189  template<typename T>
190  int send(T* object, const int &sizeOfObject = sizeof(T));
191  template<typename T>
192  int sendTo(T* object, const int &dest, const int &sizeOfObject = sizeof(T));
193 
194  int sendRequest(vpRequest &req);
195  int sendRequestTo(vpRequest &req, const int &dest);
196 
197  int sendAndEncodeRequest(vpRequest &req);
198  int sendAndEncodeRequestTo(vpRequest &req, const int &dest);
199 
207  void setMaxSizeReceivedMessage(const unsigned int &s){ max_size_message = s;}
208 
217  void setTimeoutSec(const long &sec){ tv_sec = sec; }
218 
227  void setTimeoutUSec(const long &usec){ tv_usec = usec; }
228 
234  void setVerbose(const bool &mode){ verboseMode = mode; }
235 };
236 
237 //######## Definition of Template Functions ########
238 //# #
239 //##################################################
240 
260 template<typename T>
261 int vpNetwork::receive(T* object, const int &sizeOfObject)
262 {
263  if(receptor_list.size() == 0)
264  {
265  if(verboseMode)
266  vpTRACE( "No receptor" );
267  return -1;
268  }
269 
270  tv.tv_sec = tv_sec;
271  tv.tv_usec = tv_usec;
272 
273  FD_ZERO(&readFileDescriptor);
274 
275  for(unsigned int i=0; i<receptor_list.size(); i++){
276  FD_SET(receptor_list[i].socketFileDescriptorReceptor,&readFileDescriptor);
277 
278  if(i == 0)
279  socketMax = receptor_list[i].socketFileDescriptorReceptor;
280 
281  if(socketMax < receptor_list[i].socketFileDescriptorReceptor) socketMax = receptor_list[i].socketFileDescriptorReceptor;
282  }
283 
284  int value = select(socketMax+1,&readFileDescriptor,NULL,NULL,&tv);
285  int numbytes = 0;
286 
287  if(value == -1){
288  if(verboseMode)
289  vpERROR_TRACE( "Select error" );
290  return -1;
291  }
292  else if(value == 0){
293  //Timeout
294  return 0;
295  }
296  else{
297  for(unsigned int i=0; i<receptor_list.size(); i++){
298  if(FD_ISSET(receptor_list[i].socketFileDescriptorReceptor,&readFileDescriptor)){
299  numbytes = recv(receptor_list[i].socketFileDescriptorReceptor, (char*)(void*)object, sizeOfObject, 0);
300  if(numbytes <= 0)
301  {
302  std::cout << "Disconnected : " << inet_ntoa(receptor_list[i].receptorAddress.sin_addr) << std::endl;
303  receptor_list.erase(receptor_list.begin()+i);
304  return numbytes;
305  }
306 
307  break;
308  }
309  }
310  }
311 
312  return numbytes;
313 }
314 
336 template<typename T>
337 int vpNetwork::receiveFrom(T* object, const int &receptorEmitting, const int &sizeOfObject)
338 {
339  if(receptor_list.size() == 0 || receptorEmitting > (int)receptor_list.size()-1 )
340  {
341  if(verboseMode)
342  vpTRACE( "No receptor at the specified index" );
343  return -1;
344  }
345 
346  tv.tv_sec = tv_sec;
347  tv.tv_usec = tv_usec;
348 
349  FD_ZERO(&readFileDescriptor);
350 
351  socketMax = receptor_list[receptorEmitting].socketFileDescriptorReceptor;
352  FD_SET(receptor_list[receptorEmitting].socketFileDescriptorReceptor,&readFileDescriptor);
353 
354  int value = select(socketMax+1,&readFileDescriptor,NULL,NULL,&tv);
355  int numbytes = 0;
356 
357  if(value == -1){
358  if(verboseMode)
359  vpERROR_TRACE( "Select error" );
360  return -1;
361  }
362  else if(value == 0){
363  //timeout
364  return 0;
365  }
366  else{
367  if(FD_ISSET(receptor_list[receptorEmitting].socketFileDescriptorReceptor,&readFileDescriptor)){
368  numbytes = recv(receptor_list[receptorEmitting].socketFileDescriptorReceptor, (char*)(void*)object, sizeOfObject, 0);
369 
370  if(numbytes <= 0)
371  {
372  std::cout << "Disconnected : " << inet_ntoa(receptor_list[receptorEmitting].receptorAddress.sin_addr) << std::endl;
373  receptor_list.erase(receptor_list.begin()+receptorEmitting);
374  return numbytes;
375  }
376  }
377  }
378 
379  return numbytes;
380 }
381 
402 template<typename T>
403 int vpNetwork::send(T* object, const int &sizeOfObject)
404 {
405  if(receptor_list.size() == 0)
406  {
407  if(verboseMode)
408  vpTRACE( "No receptor !" );
409  return 0;
410  }
411 
412  int flags = 0;
413 #if ! defined(APPLE) && ! defined(WIN32)
414  flags = MSG_NOSIGNAL; // Only for Linux
415 #endif
416  return sendto(receptor_list[0].socketFileDescriptorReceptor, (const char*)(void*)object, sizeOfObject,
417  flags, (sockaddr*) &receptor_list[0].receptorAddress,receptor_list[0].receptorAddressSize);
418 }
419 
441 template<typename T>
442 int vpNetwork::sendTo(T* object, const int &dest, const int &sizeOfObject)
443 {
444  if(receptor_list.size() == 0 || dest > (int)receptor_list.size()-1 )
445  {
446  if(verboseMode)
447  vpTRACE( "No receptor at the specified index." );
448  return 0;
449  }
450 
451  int flags = 0;
452 #if ! defined(APPLE) && ! defined(WIN32)
453  flags = MSG_NOSIGNAL; // Only for Linux
454 #endif
455 
456  return sendto(receptor_list[dest].socketFileDescriptorReceptor, (const char*)(void*)object, sizeOfObject,
457  flags, (sockaddr*) &receptor_list[dest].receptorAddress,receptor_list[dest].receptorAddressSize);
458 }
459 
460 #endif
unsigned int max_size_message
Definition: vpNetwork.h:115
std::string separator
Definition: vpNetwork.h:116
void setMaxSizeReceivedMessage(const unsigned int &s)
Definition: vpNetwork.h:207
std::string beginning
Definition: vpNetwork.h:117
This the request that will transit on the network.
Definition: vpRequest.h:134
std::vector< vpRequest * > request_list
Definition: vpNetwork.h:113
socklen_t receptorAddressSize
Definition: vpNetwork.h:90
std::string getRequestIdFromIndex(const int &ind)
Definition: vpNetwork.h:155
fd_set readFileDescriptor
Definition: vpNetwork.h:109
int socketFileDescriptorEmitter
Definition: vpNetwork.h:100
#define vpERROR_TRACE
Definition: vpDebug.h:379
#define vpTRACE
Definition: vpDebug.h:401
int receive(T *object, const int &sizeOfObject=sizeof(T))
Definition: vpNetwork.h:261
This class represents a Transmission Control Protocol (TCP) network.
Definition: vpNetwork.h:83
int socketFileDescriptorReceptor
Definition: vpNetwork.h:88
int socketMax
Definition: vpNetwork.h:110
int sendTo(T *object, const int &dest, const int &sizeOfObject=sizeof(T))
Definition: vpNetwork.h:442
unsigned int getMaxSizeReceivedMessage()
Definition: vpNetwork.h:168
std::string end
Definition: vpNetwork.h:118
int send(T *object, const int &sizeOfObject=sizeof(T))
Definition: vpNetwork.h:403
vpEmitter emitter
Definition: vpNetwork.h:107
void setTimeoutUSec(const long &usec)
Definition: vpNetwork.h:227
long tv_sec
Definition: vpNetwork.h:124
bool verboseMode
Definition: vpNetwork.h:127
struct timeval tv
Definition: vpNetwork.h:123
std::vector< vpReceptor > receptor_list
Definition: vpNetwork.h:108
long tv_usec
Definition: vpNetwork.h:125
void setVerbose(const bool &mode)
Definition: vpNetwork.h:234
void setTimeoutSec(const long &sec)
Definition: vpNetwork.h:217
std::string currentMessageReceived
Definition: vpNetwork.h:121
int receiveFrom(T *object, const int &receptorEmitting, const int &sizeOfObject=sizeof(T))
Definition: vpNetwork.h:337
std::string param_sep
Definition: vpNetwork.h:119
std::string receptorIP
Definition: vpNetwork.h:95