VTKFIG  0.20.20181114
Easy VTK based in situ visualization
vtkfigCommunicator.cxx
Go to the documentation of this file.
1 #include <cstdio>
2 #include <thread>
3 
4 #include "vtkfigCommunicator.h"
5 #include "config.h"
6 
7 namespace vtkfig
8 {
9  namespace internals
10  {
12 
13  Communicator::Communicator(): vtkSocketCommunicator()
14  {
15  controller =vtkSmartPointer<vtkSocketController>::New();
16  controller->SetCommunicator(this);
17  controller->Initialize();
18  }
19 
21  {
22  CloseConnection();
23  }
24 
25  int Communicator::ServerConnect(const int port)
26  {
27 
28  ssocket=vtkSmartPointer<vtkServerSocket>::New();
29 
30  int rc;
31  rc=ssocket->CreateServer(port);
32  // here, rc=0 means success...
33  if (rc) throw std::runtime_error("vtkServerSocket::CreateServer failed\n");
34 
35  rc=0;
36  int iretry=0;
37  while (iretry<server_listen_num_retry && rc==0)
38  {
39  if (iretry)
40  {
41  std::this_thread::sleep_for (std::chrono::milliseconds(server_listen_retry_timeout));
42  }
43  rc=WaitForConnection(ssocket,server_listen_waiting_time);
44  iretry++;
45  }
46  if (!rc) return rc;
47 
48  rc=Handshake();
49  if (!rc) throw std::runtime_error("Server handshake failed\n");
50 
51  return rc;
52  }
53 
54  int Communicator::ClientConnect(const char * server, const int port)
55  {
56  int rc=0;
57  int iretry=0;
58 
59  while (iretry<client_connect_num_retry && rc==0)
60  {
61  if (iretry)
62  {
63  std::this_thread::sleep_for (std::chrono::milliseconds(client_connect_retry_timeout));
64  }
65  rc=ConnectTo(server,port);
66  iretry++;
67  }
68  if (!rc) return rc;
69 
70 
71  rc=Handshake();
72  if (!rc) throw std::runtime_error("Client handshake failed");
73  return rc;
74  }
75 
76 
78  {
79  int icmd=static_cast<int>(cmd);
80  int rc=0;
81  Send(&icmd,1,remoteHandle,tag);
82  }
83 
85  {
86  int icmd=0;
87  int rc=Receive(&icmd,1,remoteHandle,tag);
88  cmd=static_cast<Command>(icmd);
89  return rc;
90  }
91 
92  int Communicator::SendInt(int i, int tag)
93  {
94  return Send(&i,1,remoteHandle,tag);
95  }
96 
97  int Communicator::ReceiveInt(int &i, int tag)
98  {
99  return Receive(&i,1,remoteHandle,tag);
100  }
101 
102  int Communicator::SendFloat(float d, int tag)
103  {
104  return Send(&d,1,remoteHandle,tag);
105  }
106 
107  int Communicator::ReceiveFloat(float &d, int tag)
108  {
109  return Receive(&d,1,remoteHandle,tag);
110  }
111 
112 
113  int Communicator::SendDouble(double d, int tag)
114  {
115  return Send(&d,1,remoteHandle,tag);
116  }
117 
118  int Communicator::ReceiveDouble(double &d, int tag)
119  {
120  return Receive(&d,1,remoteHandle,tag);
121  }
122 
123 
124  int Communicator::SendString(const std::string s, int tag)
125  {
126  SendInt(s.size());
127  return Send(s.c_str(),s.size(),remoteHandle,tag);
128  }
129 
130  int Communicator::ReceiveString(std::string &s, int tag)
131  {
132  const int bufsize=256;
133  char buf[bufsize];
134  int len=0;
135  ReceiveInt(len);
136  int rc=Receive(buf,bufsize,remoteHandle,tag);
137  s.assign(buf,len);
138  return rc;
139  }
140 
141  int Communicator::SendCharBuffer(char *buf, int ndata, int tag)
142  {
143  return Send(buf,ndata,remoteHandle,tag);
144  }
145 
146  int Communicator::ReceiveCharBuffer(char *buf, int ndata, int tag)
147  {
148  return Receive(buf,ndata,remoteHandle,tag);
149  }
150 
151  int Communicator::SendFloatBuffer(float *buf, int ndata, int tag)
152  {
153  return Send(buf,ndata,remoteHandle,tag);
154  }
155 
156  int Communicator::ReceiveFloatBuffer(float *buf, int ndata, int tag)
157  {
158  return Receive(buf,ndata,remoteHandle,tag);
159  }
160 
161 
162  int Communicator::SendDoubleBuffer(double *buf, int ndata, int tag)
163  {
164  return Send(buf,ndata,remoteHandle,tag);
165  }
166 
167  int Communicator::ReceiveDoubleBuffer(double *buf, int ndata, int tag)
168  {
169  return Receive(buf,ndata,remoteHandle,tag);
170  }
171 
172 
173 
174  }
175 
176 }
int ClientConnect(const char *server, const int port)
Derived class from vtkSocketCommunicator providing framework for server-client communication.
int ReceiveCharBuffer(char *buf, int ndata, int tag=static_cast< int >(Tag::CharBuffer))
int SendInt(int i, int tag=static_cast< int >(Tag::Int))
int ReceiveDoubleBuffer(double *buf, int ndata, int tag=static_cast< int >(Tag::DoubleBuffer))
int SendCommand(Command cmd, int tag=static_cast< int >(Tag::Command))
int ReceiveFloat(float &d, int tag=static_cast< int >(Tag::Float))
int ReceiveString(std::string &s, int tag=static_cast< int >(Tag::String))
vtkSmartPointer< vtkSocketController > controller
int ReceiveDouble(double &d, int tag=static_cast< int >(Tag::Double))
int SendDouble(double d, int tag=static_cast< int >(Tag::Double))
vtkSmartPointer< vtkServerSocket > ssocket
int ReceiveCommand(Command &cmd, int tag=static_cast< int >(Tag::Command))
int SendString(const std::string s, int tag=static_cast< int >(Tag::String))
int ReceiveFloatBuffer(float *buf, int ndata, int tag=static_cast< int >(Tag::FloatBuffer))
int SendDoubleBuffer(double *buf, int ndata, int tag=static_cast< int >(Tag::DoubleBuffer))
int ReceiveInt(int &i, int tag=static_cast< int >(Tag::Int))
int SendCharBuffer(char *buf, int ndata, int tag=static_cast< int >(Tag::CharBuffer))
int SendFloatBuffer(float *buf, int ndata, int tag=static_cast< int >(Tag::FloatBuffer))
int SendFloat(float d, int tag=static_cast< int >(Tag::Float))