RigsofRods
Soft-body Physics Simulation
All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Modules Pages
Network.h
Go to the documentation of this file.
1 /*
2  This source file is part of Rigs of Rods
3  Copyright 2005-2012 Pierre-Michel Ricordel
4  Copyright 2007-2012 Thomas Fischer
5  Copyright 2013-2016 Petr Ohlidal
6 
7  For more information, see http://www.rigsofrods.org/
8 
9  Rigs of Rods is free software: you can redistribute it and/or modify
10  it under the terms of the GNU General Public License version 3, as
11  published by the Free Software Foundation.
12 
13  Rigs of Rods is distributed in the hope that it will be useful,
14  but WITHOUT ANY WARRANTY; without even the implied warranty of
15  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16  GNU General Public License for more details.
17 
18  You should have received a copy of the GNU General Public License
19  along with Rigs of Rods. If not, see <http://www.gnu.org/licenses/>.
20 */
21 
22 #pragma once
23 
24 #ifdef USE_SOCKETW
25 
26 #include "Application.h"
27 #include "RoRnet.h"
28 
29 #include <SocketW.h>
30 
31 #include <atomic>
32 #include <condition_variable>
33 #include <deque>
34 #include <list>
35 #include <mutex>
36 #include <queue>
37 #include <string>
38 #include <thread>
39 #include <vector>
40 
41 namespace RoR {
42 
45 
47 {
48  std::string title;
49  CURLcode curl_result = CURLE_OK;
50  long http_response = 0;
51 };
52 
53 // ----------------------- Network messages (packed) -------------------------
54 
55 #pragma pack(push, 1)
56 
58 {
63 };
64 
66 {
67  int32_t command;
68 };
69 
71 {
72  int32_t command;
73  float pos_x, pos_y, pos_z;
74  float rot_angle;
75  float anim_time;
77 };
78 
80 {
81  int32_t command;
82  int32_t source_id;
83  int32_t stream_id;
84  int32_t position;
85 };
86 
88 {
90  int size;
91 };
92 
94 {
97 };
98 
99 #pragma pack(pop)
100 
101 // ------------------------ End of network messages --------------------------
102 
105 {
106  int por_uid;
108 };
109 
110 class Network
111 {
112 public:
113  bool StartConnecting();
114  void StopConnecting();
115  void Disconnect();
116 
117  void AddPacket(int streamid, int type, int len, const char *content);
118  void AddLocalStream(RoRnet::StreamRegister *reg, int size);
119 
120  std::vector<NetRecvPacket> GetIncomingStreamData();
121 
122  int GetUID();
123  int GetNetQuality();
124 
125  Ogre::String GetTerrainName();
126 
127  int GetUserColor();
128  std::string GetUsername();
130  std::vector<RoRnet::UserInfo> GetUserInfos();
131  std::vector<BitMask_t> GetAllUsersPeerOpts();
132  bool GetUserInfo(int uid, RoRnet::UserInfo &result);
133  bool GetUserPeerOpts(int uid, BitMask_t& result);
134  bool GetDisconnectedUserInfo(int uid, RoRnet::UserInfo &result);
135  bool GetAnyUserInfo(int uid, RoRnet::UserInfo &result);
136  bool FindUserInfo(std::string const& username, RoRnet::UserInfo &result);
137  Ogre::ColourValue GetPlayerColor(int color_num);
140 
141  void BroadcastChatMsg(const char* msg);
142  void WhisperChatMsg(RoRnet::UserInfo const& user, const char* msg);
143 
144  std::string UserAuthToStringShort(RoRnet::UserInfo const &user);
145  std::string UserAuthToStringLong(RoRnet::UserInfo const &user);
146 
147 private:
148  void PushNetMessage(MsgType type, std::string const & message);
149  void SetNetQuality(int quality);
150  bool SendMessageRaw(char *buffer, int msgsize);
151  bool SendNetMessage(int type, unsigned int streamid, int len, char* content);
152  void QueueStreamData(RoRnet::Header &header, char *buffer, size_t buffer_len);
153  int ReceiveMessage(RoRnet::Header *head, char* content, int bufferlen);
154  void CouldNotConnect(std::string const & msg, bool close_socket = true);
155 
156  bool ConnectThread();
157  void SendThread();
158  void RecvThread();
159 
160  // Variables
161 
162  SWInetSocket m_socket;
163 
166  std::vector<RoRnet::UserInfo> m_users;
167  std::vector<BitMask_t> m_users_peeropts;
168  std::vector<RoRnet::UserInfo> m_disconnected_users;
169 
170  std::string m_username; // Shadows GVar 'mp_player_name' for multithreaded access.
171  std::string m_net_host; // Shadows GVar 'mp_server_host' for multithreaded access.
172  std::string m_password; // Shadows GVar 'mp_server_password' for multithreaded access.
173  std::string m_token; // Shadows GVar 'mp_player_token' for multithreaded access.
174  int m_net_port; // Shadows GVar 'mp_server_port' for multithreaded access.
175  int m_uid;
177 
178  std::thread m_send_thread;
179  std::thread m_recv_thread;
180  std::thread m_connect_thread;
181 
182  std::string m_status_message;
183  std::atomic<bool> m_shutdown;
184  std::atomic<int> m_net_quality;
185  int m_stream_id = 10;
186 
187  std::mutex m_users_mutex;
188  std::mutex m_userdata_mutex;
191 
192  std::condition_variable m_send_packet_available_cv;
193 
194  std::vector<NetRecvPacket> m_recv_packet_buffer;
195  std::deque <NetSendPacket> m_send_packet_buffer;
196 };
197 
199 
200 } // namespace RoR
201 
202 #endif // USE_SOCKETW
RoR::NetCharacterMsgAttach
Definition: Network.h:79
RoR::Network::Disconnect
void Disconnect()
Definition: Network.cpp:565
RoR::Network::m_users_peeropts
std::vector< BitMask_t > m_users_peeropts
See RoRnet::PeerOptions.
Definition: Network.h:167
RoR::Network::GetUserInfos
std::vector< RoRnet::UserInfo > GetUserInfos()
Definition: Network.cpp:706
RoR::Network::PushNetMessage
void PushNetMessage(MsgType type, std::string const &message)
Definition: Network.cpp:87
RoR::Network::m_server_settings
RoRnet::ServerInfo m_server_settings
Definition: Network.h:164
RoR::CHARACTER_CMD_DETACH
@ CHARACTER_CMD_DETACH
Definition: Network.h:62
RoR::Network::m_recv_packetqueue_mutex
std::mutex m_recv_packetqueue_mutex
Definition: Network.h:189
RoR::Network::StartConnecting
bool StartConnecting()
Launches connecting on background.
Definition: Network.cpp:394
RoR::Network::ConnectThread
bool ConnectThread()
Definition: Network.cpp:427
RoR::Network::UserAuthToStringShort
std::string UserAuthToStringShort(RoRnet::UserInfo const &user)
Definition: Network.cpp:854
RoR::CurlFailInfo::http_response
long http_response
Definition: Network.h:50
RoR::Network::GetUserColor
int GetUserColor()
Definition: Network.cpp:688
RoR::NetCharacterMsgAttach::source_id
int32_t source_id
Definition: Network.h:82
RoRnet::UserInfo
Definition: RoRnet.h:178
RoR::Network::GetUID
int GetUID()
Definition: Network.cpp:122
RoR::Network::m_status_message
std::string m_status_message
Definition: Network.h:182
RoR::Network::QueueStreamData
void QueueStreamData(RoRnet::Header &header, char *buffer, size_t buffer_len)
Definition: Network.cpp:163
RoRnet.h
RoR::Network::GetIncomingStreamData
std::vector< NetRecvPacket > GetIncomingStreamData()
Definition: Network.cpp:675
RoR::PeerOptionsRequest::por_uid
int por_uid
RoRnet unique user ID.
Definition: Network.h:106
RoR::NetCharacterMsgPos::anim_name
char anim_name[CHARACTER_ANIM_NAME_LEN]
Definition: Network.h:76
RoR::Network::m_userdata_mutex
std::mutex m_userdata_mutex
Definition: Network.h:188
RoRnet::ServerInfo
Definition: RoRnet.h:210
RoR::Network::m_password
std::string m_password
Definition: Network.h:172
RoR::Network::GetAnyUserInfo
bool GetAnyUserInfo(int uid, RoRnet::UserInfo &result)
Also considers local client.
Definition: Network.cpp:760
RoR::CurlFailInfo
Definition: Network.h:46
RoR::Network::GetUserPeerOpts
bool GetUserPeerOpts(int uid, BitMask_t &result)
Definition: Network.cpp:732
RoR::NetRecvPacket::header
RoRnet::Header header
Definition: Network.h:95
RoR::NetCharacterMsgPos::rot_angle
float rot_angle
Definition: Network.h:74
RoR::Network::GetUserInfo
bool GetUserInfo(int uid, RoRnet::UserInfo &result)
Definition: Network.cpp:718
RoR::CurlFailInfo::title
std::string title
Definition: Network.h:48
RoR::NetSendPacket::size
int size
Definition: Network.h:90
RoR::NetSendPacket::buffer
char buffer[RORNET_MAX_MESSAGE_LENGTH]
Definition: Network.h:89
RoR::Network::GetTerrainName
Ogre::String GetTerrainName()
Definition: Network.cpp:683
RoR::NetCharacterMsgGeneric::command
int32_t command
Definition: Network.h:67
RoR::NetCharacterMsgGeneric
Definition: Network.h:65
RoR::Network::GetAllUsersPeerOpts
std::vector< BitMask_t > GetAllUsersPeerOpts()
Definition: Network.cpp:712
RoR::Network::m_net_quality
std::atomic< int > m_net_quality
Definition: Network.h:184
RoR::CHARACTER_CMD_ATTACH
@ CHARACTER_CMD_ATTACH
Definition: Network.h:61
RoR::NetCharacterMsgPos::anim_time
float anim_time
Definition: Network.h:75
RoR::NetCharacterMsgPos
Definition: Network.h:70
RoR::Network::BroadcastChatMsg
void BroadcastChatMsg(const char *msg)
Definition: Network.cpp:831
RoR::Network::GetDisconnectedUserInfo
bool GetDisconnectedUserInfo(int uid, RoRnet::UserInfo &result)
Definition: Network.cpp:746
RoR::Network::GetNetQuality
int GetNetQuality()
Definition: Network.cpp:117
RORNET_MAX_MESSAGE_LENGTH
#define RORNET_MAX_MESSAGE_LENGTH
maximum size of a RoR message. 8192 bytes = 8 kibibytes
Definition: RoRnet.h:31
RoR::Network::SendNetMessage
bool SendNetMessage(int type, unsigned int streamid, int len, char *content)
Definition: Network.cpp:140
RoR::Network::m_shutdown
std::atomic< bool > m_shutdown
Definition: Network.h:183
RoR::NetCharacterMsgAttach::command
int32_t command
Definition: Network.h:81
RoR::PeerOptionsRequest::por_peeropts
BitMask_t por_peeropts
See RoRnet::PeerOptions.
Definition: Network.h:107
RoR::NetCharacterMsgAttach::position
int32_t position
Definition: Network.h:84
RoR::Network::CouldNotConnect
void CouldNotConnect(std::string const &msg, bool close_socket=true)
Definition: Network.cpp:382
RoR::Network::m_username
std::string m_username
Definition: Network.h:170
RoR::Network::AddPeerOptions
void AddPeerOptions(PeerOptionsRequest *rq)
Definition: Network.cpp:797
RoR::MsgType
MsgType
Global gameplay message loop, see struct Message in GameContext.h.
Definition: Application.h:74
Application.h
Central state/object manager and communications hub.
RoR::Network::m_token
std::string m_token
Definition: Network.h:173
RoR::Network::m_send_packetqueue_mutex
std::mutex m_send_packetqueue_mutex
Definition: Network.h:190
RoRnet::Header
< Common header for every packet
Definition: RoRnet.h:140
RoR::Network::GetLocalUserData
RoRnet::UserInfo GetLocalUserData()
Definition: Network.cpp:700
RoR::CHARACTER_CMD_POSITION
@ CHARACTER_CMD_POSITION
Definition: Network.h:60
RoR::NetCharacterMsgPos::pos_x
float pos_x
Definition: Network.h:73
RoR::Network::ReceiveMessage
int ReceiveMessage(RoRnet::Header *head, char *content, int bufferlen)
Definition: Network.cpp:173
RoR::Network::m_uid
int m_uid
Definition: Network.h:175
RoR::Network::m_recv_thread
std::thread m_recv_thread
Definition: Network.h:179
RoR::Network::m_userdata
RoRnet::UserInfo m_userdata
Definition: Network.h:165
RoR::Network::SendMessageRaw
bool SendMessageRaw(char *buffer, int msgsize)
Definition: Network.cpp:127
RoR::Network::m_stream_id
int m_stream_id
Counter.
Definition: Network.h:185
RoR::Network::GetPlayerColor
Ogre::ColourValue GetPlayerColor(int color_num)
Definition: Network.cpp:94
RoR::NetSendPacket
Definition: Network.h:87
RoR::Network::m_users
std::vector< RoRnet::UserInfo > m_users
Definition: Network.h:166
RoR::Network
Definition: Network.h:110
RoR::Network::FindUserInfo
bool FindUserInfo(std::string const &username, RoRnet::UserInfo &result)
Definition: Network.cpp:782
RoR::Network::RecvThread
void RecvThread()
Definition: Network.cpp:238
RoR::NetCharacterMsgPos::command
int32_t command
Definition: Network.h:72
RoR::Network::RemovePeerOptions
void RemovePeerOptions(PeerOptionsRequest *rq)
Definition: Network.cpp:814
RoR::Network::SetNetQuality
void SetNetQuality(int quality)
Definition: Network.cpp:112
RoR::Network::m_send_thread
std::thread m_send_thread
Definition: Network.h:178
RoR::Network::m_disconnected_users
std::vector< RoRnet::UserInfo > m_disconnected_users
Definition: Network.h:168
RoR::Network::GetUsername
std::string GetUsername()
Definition: Network.cpp:694
RoR::PeerOptionsRequest
Payload of MSG_NET_{ADD/REMOVE}_PEEROPTIONS_REQUESTED.
Definition: Network.h:104
RoR::NetCharacterMsgPos::pos_y
float pos_y
Definition: Network.h:73
RoR::Network::m_net_host
std::string m_net_host
Definition: Network.h:171
RoR::Network::m_recv_packet_buffer
std::vector< NetRecvPacket > m_recv_packet_buffer
Definition: Network.h:194
RoR::Network::m_socket
SWInetSocket m_socket
Definition: Network.h:162
RoR::NetRecvPacket::buffer
char buffer[RORNET_MAX_MESSAGE_LENGTH]
Definition: Network.h:96
BitMask_t
uint32_t BitMask_t
Definition: BitFlags.h:7
RoR::Network::UserAuthToStringLong
std::string UserAuthToStringLong(RoRnet::UserInfo const &user)
Definition: Network.cpp:864
RoR::NetCharacterCmd
NetCharacterCmd
Definition: Network.h:57
RoR::CurlFailInfo::curl_result
CURLcode curl_result
Definition: Network.h:49
RoR::NetCharacterMsgAttach::stream_id
int32_t stream_id
Definition: Network.h:83
RoR::CHARACTER_CMD_INVALID
@ CHARACTER_CMD_INVALID
Definition: Network.h:59
RoR::Network::m_send_packet_available_cv
std::condition_variable m_send_packet_available_cv
Definition: Network.h:192
RoR::Network::AddLocalStream
void AddLocalStream(RoRnet::StreamRegister *reg, int size)
Definition: Network.cpp:663
RoR::Network::m_users_mutex
std::mutex m_users_mutex
Definition: Network.h:187
RoR::NetRecvPacket
Definition: Network.h:93
RoR::Network::m_net_port
int m_net_port
Definition: Network.h:174
CHARACTER_ANIM_NAME_LEN
#define CHARACTER_ANIM_NAME_LEN
Definition: Application.h:42
RoR::Network::AddPacket
void AddPacket(int streamid, int type, int len, const char *content)
Definition: Network.cpp:609
RoR
Definition: AppContext.h:36
RoR::Network::m_send_packet_buffer
std::deque< NetSendPacket > m_send_packet_buffer
Definition: Network.h:195
RoR::Network::m_authlevel
int m_authlevel
Definition: Network.h:176
RoR::NetCharacterMsgPos::pos_z
float pos_z
Definition: Network.h:73
RoR::Network::SendThread
void SendThread()
Definition: Network.cpp:214
RoR::Network::m_connect_thread
std::thread m_connect_thread
Definition: Network.h:180
RoR::Network::WhisperChatMsg
void WhisperChatMsg(RoRnet::UserInfo const &user, const char *msg)
Definition: Network.cpp:836
RoRnet::StreamRegister
< Sent from the client to server and vice versa, to broadcast a new stream
Definition: RoRnet.h:148
RoR::Network::StopConnecting
void StopConnecting()
Definition: Network.cpp:419