SGCT master (487fac4)
Simple Graphics Cluster Toolkit
Loading...
Searching...
No Matches
network.h
Go to the documentation of this file.
1/*****************************************************************************************
2 * SGCT *
3 * Simple Graphics Cluster Toolkit *
4 * *
5 * Copyright (c) 2012-2026 *
6 * For conditions of distribution and use, see copyright notice in LICENSE.md *
7 ****************************************************************************************/
8
9#ifndef __SGCT__NETWORK__H__
10#define __SGCT__NETWORK__H__
11
12#include <sgct/sgctexports.h>
13
14#include <atomic>
15#include <condition_variable>
16#include <cstdint>
17#include <functional>
18#include <memory>
19#include <mutex>
20#include <string>
21#include <thread>
22#include <vector>
23
24#ifdef WIN32
25using SGCT_SOCKET = size_t;
26#else // ^^^^ WIN32 // !WIN32 vvvv
27using SGCT_SOCKET = int;
28#endif // WIN32
29
30namespace sgct {
31
35class SGCT_EXPORT Network {
36public:
37 // ASCII device control chars = 17, 18, 19 & 20
38 static constexpr char DefaultId = 0;
39 static constexpr char Ack = 6;
40 static constexpr char DataId = 17;
41 static constexpr char ConnectedId = 18;
42 static constexpr char DisconnectId = 19;
43
44 enum class ConnectionType { SyncConnection, DataTransfer };
45
46 static constexpr size_t HeaderSize = 13;
47
51 static int lastError();
52
59 Network(int port, const std::string& address, bool isServer, ConnectionType t);
61
62 void initialize();
63 void closeNetwork(bool forced);
65
66 void setDecodeFunction(std::function<void(const char*, int)> fn);
67 void setPackageDecodeFunction(std::function<void(void*, int, int, int)> fn);
68 void setUpdateFunction(std::function<void(Network&)> fn);
69 void setConnectedFunction(std::function<void (void)> fn);
70 void setAcknowledgeFunction(std::function<void(int, int)> fn);
71
72 void setConnectedStatus(bool state);
73 void closeSocket(SGCT_SOCKET lSocket);
74
76 int id() const;
77 bool isServer() const;
78 bool isConnected() const;
79
80 int sendFrameCurrent() const;
81 int recvFrameCurrent() const;
82 int recvFramePrevious() const;
83
87 double loopTime() const;
88
97 bool isUpdated() const;
98 void sendData(const void* data, int length) const;
99
104
109
113 int port() const;
114
115 std::condition_variable& startConnectionConditionVar();
116
117private:
118 Network(const Network&) = delete;
119 Network(Network&&) = delete;
120 Network& operator=(const Network&) = delete;
121 Network& operator=(Network&&) = delete;
122
123 void setRecvFrame(int i);
124 void updateBuffer(std::vector<char>& buffer, uint32_t reqSize, uint32_t& currSize);
125 int readSyncMessage(char* header, int32_t& syncFrame, uint32_t& dataSize,
126 uint32_t& uncompressedDataSize);
127 int readDataTransferMessage(char* header, int32_t& packageId, uint32_t& dataSize,
128 uint32_t& uncompressedDataSize);
129 int readExternalMessage();
130
131 void communicationHandler();
132 void connectionHandler();
133
134 SGCT_SOCKET _socket;
135 SGCT_SOCKET _listenSocket;
136
137 const ConnectionType _connectionType = ConnectionType::SyncConnection;
138 std::atomic_bool _isServer;
139 std::atomic_bool _isConnected = false;
140 std::atomic_bool _isUpdated = false;
141 std::atomic<int32_t> _currentSendFrame = 0;
142 std::atomic<int32_t> _previousSendFrame = 0;
143 std::atomic<int32_t> _currentRecvFrame = 0;
144 std::atomic<int32_t> _previousRecvFrame = -1;
145 std::atomic_bool _shouldTerminate = false; // set to true upon exit
146
147 mutable std::mutex _connectionMutex;
148 std::unique_ptr<std::thread> _commThread;
149 std::unique_ptr<std::thread> _mainThread;
150
151 double _timeStampSend = 0.0;
152 std::atomic<double> _timeStampTotal = 0.0;
153 int _id;
154 uint32_t _bufferSize = 1024;
155 uint32_t _uncompressedBufferSize = _bufferSize;
156 std::atomic<uint32_t> _requestedSize = _bufferSize;
157 const int _port = -1;
158
159 std::vector<char> _recvBuffer;
160 std::vector<char> _uncompressBuffer;
161 char _headerId = 0;
162
163 std::condition_variable _startConnectionCond;
164
165 std::function<void(const char*, int)> decoderCallback;
166 std::function<void(void*, int, int, int)> _packageDecoderCallback;
167 std::function<void(Network&)> _updateCallback;
168 std::function<void(void)> _connectedCallback;
169 std::function<void(int, int)> _acknowledgeCallback;
170};
171
172} // namespace sgct
173
174#endif // __SGCT__NETWORK__H__
std::condition_variable & startConnectionConditionVar()
bool isConnected() const
static constexpr char DisconnectId
Definition network.h:42
void initShutdown()
void setDecodeFunction(std::function< void(const char *, int)> fn)
void closeNetwork(bool forced)
void pushClientMessage()
The client sends ack message to server + console messages.
int sendFrameCurrent() const
void setAcknowledgeFunction(std::function< void(int, int)> fn)
static constexpr char Ack
Definition network.h:39
ConnectionType type() const
void setConnectedFunction(std::function< void(void)> fn)
bool isUpdated() const
This function compares the received frame number with the sent frame number.
int recvFramePrevious() const
void initialize()
int recvFrameCurrent() const
double loopTime() const
Get the time in seconds from send to receive of sync data.
Network(int port, const std::string &address, bool isServer, ConnectionType t)
int id() const
static constexpr size_t HeaderSize
Definition network.h:46
static constexpr char ConnectedId
Definition network.h:41
static int lastError()
bool isServer() const
void setConnectedStatus(bool state)
ConnectionType
Definition network.h:44
@ SyncConnection
Definition network.h:44
int port() const
void setUpdateFunction(std::function< void(Network &)> fn)
int iterateFrameCounter()
Iterates the send frame number and returns the new frame number.
void setPackageDecodeFunction(std::function< void(void *, int, int, int)> fn)
static constexpr char DefaultId
Definition network.h:38
void sendData(const void *data, int length) const
static constexpr char DataId
Definition network.h:40
void closeSocket(SGCT_SOCKET lSocket)
Definition actions.h:16
int SGCT_SOCKET
Definition network.h:27