Eclipse SUMO - Simulation of Urban MObility
OutputDevice_Network.cpp
Go to the documentation of this file.
1 /****************************************************************************/
2 // Eclipse SUMO, Simulation of Urban MObility; see https://eclipse.dev/sumo
3 // Copyright (C) 2006-2024 German Aerospace Center (DLR) and others.
4 // This program and the accompanying materials are made available under the
5 // terms of the Eclipse Public License 2.0 which is available at
6 // https://www.eclipse.org/legal/epl-2.0/
7 // This Source Code may also be made available under the following Secondary
8 // Licenses when the conditions for such availability set forth in the Eclipse
9 // Public License 2.0 are satisfied: GNU General Public License, version 2
10 // or later which is available at
11 // https://www.gnu.org/licenses/old-licenses/gpl-2.0-standalone.html
12 // SPDX-License-Identifier: EPL-2.0 OR GPL-2.0-or-later
13 /****************************************************************************/
20 // An output device for TCP/IP Network connections
21 /****************************************************************************/
22 
23 
24 // ==========================================================================
25 // included modules
26 // ==========================================================================
27 #include <config.h>
28 
29 #include <thread>
30 #include <chrono>
31 #include <vector>
32 #include "OutputDevice_Network.h"
33 #include "foreign/tcpip/socket.h"
34 #include "utils/common/ToString.h"
35 
36 
37 // ==========================================================================
38 // method definitions
39 // ==========================================================================
41  const int port) : OutputDevice(0, host + ":" + toString(port)) {
42  mySocket = new tcpip::Socket(host, port);
43  for (int wait = 1; wait < 10; wait += 1) {
44  try {
45  mySocket->connect();
46  break;
47  } catch (tcpip::SocketException& e) {
48  if (wait == 9) {
49  throw IOError(toString(e.what()) + " (host: " + host + ", port: " + toString(port) + ")");
50  }
51  std::this_thread::sleep_for(std::chrono::seconds(wait));
52  }
53  }
54 }
55 
56 
58  mySocket->close();
59  delete mySocket;
60 }
61 
62 
63 std::ostream&
65  return myMessage;
66 }
67 
68 
69 void
71  const std::string toSend = myMessage.str();
72  myMessage.str("");
73  if (toSend.empty() || !mySocket->has_client_connection()) {
74  return;
75  }
76  std::vector<unsigned char> msg;
77  msg.insert(msg.end(), toSend.begin(), toSend.end());
78  try {
79  mySocket->send(msg);
80  } catch (const tcpip::SocketException& e) {
81  mySocket->close();
82  throw IOError(e.what());
83  }
84 }
85 
86 
87 /****************************************************************************/
std::string toString(const T &t, std::streamsize accuracy=gPrecision)
Definition: ToString.h:46
OutputDevice_Network(const std::string &host, const int port)
Constructor.
tcpip::Socket * mySocket
the socket to transfer the data
std::ostringstream myMessage
packet buffer
std::ostream & getOStream()
Returns the associated ostream.
virtual void postWriteHook()
Sends the data which was written to the string stream over the socket.
Static storage of an output device and its base (abstract) implementation.
Definition: OutputDevice.h:61
bool has_client_connection() const
Definition: socket.cpp:568
void connect()
Connects to host_:port_.
Definition: socket.cpp:367
void send(const std::vector< unsigned char > &buffer)
Definition: socket.cpp:409
void close()
Definition: socket.cpp:391