fix: Telepathy V1.9

This commit is contained in:
mischa 2023-11-10 11:23:49 +01:00
parent dff404e78e
commit d1c60845bd
4 changed files with 26 additions and 24 deletions

View File

@ -153,7 +153,7 @@ static void ReceiveThreadFunction(ClientConnectionState state, string ip, int po
{ {
// this happens if (for example) the ip address is correct // this happens if (for example) the ip address is correct
// but there is no server running on that ip/port // but there is no server running on that ip/port
Log.Info("[Telepathy] Client Recv: failed to connect to ip=" + ip + " port=" + port + " reason=" + exception); Log.Info("Client Recv: failed to connect to ip=" + ip + " port=" + port + " reason=" + exception);
} }
catch (ThreadInterruptedException) catch (ThreadInterruptedException)
{ {
@ -171,7 +171,7 @@ static void ReceiveThreadFunction(ClientConnectionState state, string ip, int po
catch (Exception exception) catch (Exception exception)
{ {
// something went wrong. probably important. // something went wrong. probably important.
Log.Error("[Telepathy] Client Recv Exception: " + exception); Log.Error("Client Recv Exception: " + exception);
} }
// add 'Disconnected' event to receive pipe so that the caller // add 'Disconnected' event to receive pipe so that the caller
// knows that the Connect failed. otherwise they will never know // knows that the Connect failed. otherwise they will never know
@ -200,7 +200,7 @@ public void Connect(string ip, int port)
// not if already started // not if already started
if (Connecting || Connected) if (Connecting || Connected)
{ {
Log.Warning("[Telepathy] Client can not create connection because an existing connection is connecting or connected"); Log.Warning("Telepathy Client can not create connection because an existing connection is connecting or connected");
return; return;
} }
@ -287,17 +287,17 @@ public bool Send(ArraySegment<byte> message)
else else
{ {
// log the reason // log the reason
Log.Warning($"[Telepathy] Client.Send: sendPipe reached limit of {SendQueueLimit}. This can happen if we call send faster than the network can process messages. Disconnecting to avoid ever growing memory & latency."); Log.Warning($"Client.Send: sendPipe reached limit of {SendQueueLimit}. This can happen if we call send faster than the network can process messages. Disconnecting to avoid ever growing memory & latency.");
// just close it. send thread will take care of the rest. // just close it. send thread will take care of the rest.
state.client.Close(); state.client.Close();
return false; return false;
} }
} }
Log.Error("[Telepathy] Client.Send: message too big: " + message.Count + ". Limit: " + MaxMessageSize); Log.Error("Client.Send: message too big: " + message.Count + ". Limit: " + MaxMessageSize);
return false; return false;
} }
Log.Warning("[Telepathy] Client.Send: not connected!"); Log.Warning("Client.Send: not connected!");
return false; return false;
} }

View File

@ -95,7 +95,7 @@ void Listen(int port)
//listener.Server.SendTimeout = SendTimeout; //listener.Server.SendTimeout = SendTimeout;
//listener.Server.ReceiveTimeout = ReceiveTimeout; //listener.Server.ReceiveTimeout = ReceiveTimeout;
listener.Start(); listener.Start();
Log.Info($"[Telepathy] Starting server on port {port}"); Log.Info("Server: listening port=" + port);
// keep accepting new clients // keep accepting new clients
while (true) while (true)
@ -138,7 +138,7 @@ void Listen(int port)
} }
catch (Exception exception) catch (Exception exception)
{ {
Log.Error("[Telepathy] Server send thread exception: " + exception); Log.Error("Server send thread exception: " + exception);
} }
}); });
sendThread.IsBackground = true; sendThread.IsBackground = true;
@ -172,7 +172,7 @@ void Listen(int port)
} }
catch (Exception exception) catch (Exception exception)
{ {
Log.Error("[Telepathy] Server client thread exception: " + exception); Log.Error("Server client thread exception: " + exception);
} }
}); });
receiveThread.IsBackground = true; receiveThread.IsBackground = true;
@ -183,18 +183,18 @@ void Listen(int port)
{ {
// UnityEditor causes AbortException if thread is still // UnityEditor causes AbortException if thread is still
// running when we press Play again next time. that's okay. // running when we press Play again next time. that's okay.
Log.Info("[Telepathy] Server thread aborted. That's okay. " + exception); Log.Info("Server thread aborted. That's okay. " + exception);
} }
catch (SocketException exception) catch (SocketException exception)
{ {
// calling StopServer will interrupt this thread with a // calling StopServer will interrupt this thread with a
// 'SocketException: interrupted'. that's okay. // 'SocketException: interrupted'. that's okay.
Log.Info("[Telepathy] Server Thread stopped. That's okay. " + exception); Log.Info("Server Thread stopped. That's okay. " + exception);
} }
catch (Exception exception) catch (Exception exception)
{ {
// something went wrong. probably important. // something went wrong. probably important.
Log.Error("[Telepathy] Server Exception: " + exception); Log.Error("Server Exception: " + exception);
} }
} }
@ -215,8 +215,7 @@ public bool Start(int port)
// start the listener thread // start the listener thread
// (on low priority. if main thread is too busy then there is not // (on low priority. if main thread is too busy then there is not
// much value in accepting even more clients) // much value in accepting even more clients)
Log.Info($"[Telepathy] Starting server on port {port}"); Log.Info("Server: Start port=" + port);
listenerThread = new Thread(() => { Listen(port); }); listenerThread = new Thread(() => { Listen(port); });
listenerThread.IsBackground = true; listenerThread.IsBackground = true;
listenerThread.Priority = ThreadPriority.BelowNormal; listenerThread.Priority = ThreadPriority.BelowNormal;
@ -229,7 +228,7 @@ public void Stop()
// only if started // only if started
if (!Active) return; if (!Active) return;
Log.Info("[Telepathy] Server: stopping..."); Log.Info("Server: stopping...");
// stop listening to connections so that no one can connect while we // stop listening to connections so that no one can connect while we
// close the client connections // close the client connections
@ -296,7 +295,7 @@ public bool Send(int connectionId, ArraySegment<byte> message)
else else
{ {
// log the reason // log the reason
Log.Warning($"[Telepathy] Server.Send: sendPipe for connection {connectionId} reached limit of {SendQueueLimit}. This can happen if we call send faster than the network can process messages. Disconnecting this connection for load balancing."); Log.Warning($"Server.Send: sendPipe for connection {connectionId} reached limit of {SendQueueLimit}. This can happen if we call send faster than the network can process messages. Disconnecting this connection for load balancing.");
// just close it. send thread will take care of the rest. // just close it. send thread will take care of the rest.
connection.client.Close(); connection.client.Close();
@ -312,7 +311,7 @@ public bool Send(int connectionId, ArraySegment<byte> message)
//Logger.Log("Server.Send: invalid connectionId: " + connectionId); //Logger.Log("Server.Send: invalid connectionId: " + connectionId);
return false; return false;
} }
Log.Error("[Telepathy] Server.Send: message too big: " + message.Count + ". Limit: " + MaxMessageSize); Log.Error("Server.Send: message too big: " + message.Count + ". Limit: " + MaxMessageSize);
return false; return false;
} }
@ -335,7 +334,7 @@ public bool Disconnect(int connectionId)
{ {
// just close it. send thread will take care of the rest. // just close it. send thread will take care of the rest.
connection.client.Close(); connection.client.Close();
Log.Info("[Telepathy] Server.Disconnect connectionId:" + connectionId); Log.Info("Server.Disconnect connectionId:" + connectionId);
return true; return true;
} }
return false; return false;

View File

@ -34,7 +34,7 @@ public static bool SendMessagesBlocking(NetworkStream stream, byte[] payload, in
catch (Exception exception) catch (Exception exception)
{ {
// log as regular message because servers do shut down sometimes // log as regular message because servers do shut down sometimes
Log.Info("[Telepathy] Send: stream.Write exception: " + exception); Log.Info("Send: stream.Write exception: " + exception);
return false; return false;
} }
} }
@ -47,7 +47,7 @@ public static bool ReadMessageBlocking(NetworkStream stream, int MaxMessageSize,
// buffer needs to be of Header + MaxMessageSize // buffer needs to be of Header + MaxMessageSize
if (payloadBuffer.Length != 4 + MaxMessageSize) if (payloadBuffer.Length != 4 + MaxMessageSize)
{ {
Log.Error($"[Telepathy] ReadMessageBlocking: payloadBuffer needs to be of size 4 + MaxMessageSize = {4 + MaxMessageSize} instead of {payloadBuffer.Length}"); Log.Error($"ReadMessageBlocking: payloadBuffer needs to be of size 4 + MaxMessageSize = {4 + MaxMessageSize} instead of {payloadBuffer.Length}");
return false; return false;
} }
@ -68,7 +68,7 @@ public static bool ReadMessageBlocking(NetworkStream stream, int MaxMessageSize,
// read exactly 'size' bytes for content (blocking) // read exactly 'size' bytes for content (blocking)
return stream.ReadExactly(payloadBuffer, size); return stream.ReadExactly(payloadBuffer, size);
} }
Log.Warning("[Telepathy] ReadMessageBlocking: possible header attack with a header of: " + size + " bytes."); Log.Warning("ReadMessageBlocking: possible header attack with a header of: " + size + " bytes.");
return false; return false;
} }
@ -139,7 +139,7 @@ public static void ReceiveLoop(int connectionId, TcpClient client, int MaxMessag
if (receivePipe.Count(connectionId) >= QueueLimit) if (receivePipe.Count(connectionId) >= QueueLimit)
{ {
// log the reason // log the reason
Log.Warning($"[Telepathy] ReceivePipe reached limit of {QueueLimit} for connectionId {connectionId}. This can happen if network messages come in way faster than we manage to process them. Disconnecting this connection for load balancing."); Log.Warning($"receivePipe reached limit of {QueueLimit} for connectionId {connectionId}. This can happen if network messages come in way faster than we manage to process them. Disconnecting this connection for load balancing.");
// IMPORTANT: do NOT clear the whole queue. we use one // IMPORTANT: do NOT clear the whole queue. we use one
// queue for all connections. // queue for all connections.
@ -155,7 +155,7 @@ public static void ReceiveLoop(int connectionId, TcpClient client, int MaxMessag
// something went wrong. the thread was interrupted or the // something went wrong. the thread was interrupted or the
// connection closed or we closed our own connection or ... // connection closed or we closed our own connection or ...
// -> either way we should stop gracefully // -> either way we should stop gracefully
Log.Info("[Telepathy] ReceiveLoop finished receive function for connectionId=" + connectionId + " reason: " + exception); Log.Info("ReceiveLoop: finished receive function for connectionId=" + connectionId + " reason: " + exception);
} }
finally finally
{ {
@ -226,7 +226,7 @@ public static void SendLoop(int connectionId, TcpClient client, MagnificentSendP
// something went wrong. the thread was interrupted or the // something went wrong. the thread was interrupted or the
// connection closed or we closed our own connection or ... // connection closed or we closed our own connection or ...
// -> either way we should stop gracefully // -> either way we should stop gracefully
Log.Info("[Telepathy] SendLoop Exception: connectionId=" + connectionId + " reason: " + exception); Log.Info("SendLoop Exception: connectionId=" + connectionId + " reason: " + exception);
} }
finally finally
{ {

View File

@ -1,3 +1,6 @@
V1.9 [2023-11-10]
- fix: Always enqueue Disconnected event (imer)
V1.8 [2021-06-02] V1.8 [2021-06-02]
- fix: Do not set timeouts on listener (fixes https://github.com/vis2k/Mirror/issues/2695) - fix: Do not set timeouts on listener (fixes https://github.com/vis2k/Mirror/issues/2695)
- fix: #104 - ReadSafely now catches ObjectDisposedException too - fix: #104 - ReadSafely now catches ObjectDisposedException too