Skip to content

Commit

Permalink
Merge pull request #556 from FirstGearGames/pausedSocketFix
Browse files Browse the repository at this point in the history
Improved PausedSocketFix
  • Loading branch information
RevenantX authored Aug 2, 2024
2 parents ebe4261 + 85ac67d commit 76f91b5
Show file tree
Hide file tree
Showing 2 changed files with 68 additions and 46 deletions.
30 changes: 17 additions & 13 deletions LiteNetLib/NetManager.Socket.cs
Original file line number Diff line number Diff line change
@@ -1,4 +1,7 @@
using System.Runtime.InteropServices;
#if UNITY_2018_3_OR_NEWER
#define UNITY_SOCKET_FIX
#endif
using System.Runtime.InteropServices;
using System;
using System.Collections.Generic;
using System.Net;
Expand All @@ -17,8 +20,9 @@ public partial class NetManager
private Thread _receiveThread;
private IPEndPoint _bufferEndPointv4;
private IPEndPoint _bufferEndPointv6;
#if UNITY_2018_3_OR_NEWER
#if UNITY_SOCKET_FIX
private PausedSocketFix _pausedSocketFix;
private bool _useSocketFix;
#endif

#if NET8_0_OR_GREATER
Expand Down Expand Up @@ -114,7 +118,7 @@ private void ManualReceive(Socket socket, EndPoint bufferEndPoint, int maxReceiv
catch (Exception e)
{
//protects socket receive thread
NetDebug.WriteError("[NM] SocketReceiveThread error: " + e );
NetDebug.WriteError("[NM] SocketReceiveThread error: " + e);
}
}

Expand Down Expand Up @@ -182,7 +186,7 @@ private void NativeReceiveLogic()
catch (Exception e)
{
//protects socket receive thread
NetDebug.WriteError("[NM] SocketReceiveThread error: " + e );
NetDebug.WriteError("[NM] SocketReceiveThread error: " + e);
}
}

Expand All @@ -201,8 +205,8 @@ bool NativeReceiveFrom(IntPtr s, byte[] address)

//NetDebug.WriteForce($"[R]Received data from {endPoint}, result: {packet.Size}");
//refresh temp Addr/Port
short family = (short)((address[1] << 8) | address[0]);
tempEndPoint.Port =(ushort)((address[2] << 8) | address[3]);
short family = (short)((address[1] << 8) | address[0]);
tempEndPoint.Port = (ushort)((address[2] << 8) | address[3]);
if ((NativeSocket.UnixMode && family == NativeSocket.AF_INET6) || (!NativeSocket.UnixMode && (AddressFamily)family == AddressFamily.InterNetworkV6))
{
uint scope = unchecked((uint)(
Expand Down Expand Up @@ -317,12 +321,12 @@ private void ReceiveLogic()
catch (Exception e)
{
//protects socket receive thread
NetDebug.WriteError("[NM] SocketReceiveThread error: " + e );
NetDebug.WriteError("[NM] SocketReceiveThread error: " + e);
}
}
}

/// <summary>
/// <summary>
/// Start logic thread and listening on selected port
/// </summary>
/// <param name="addressIPv4">bind to specific ipv4 address</param>
Expand All @@ -341,10 +345,10 @@ public bool Start(IPAddress addressIPv4, IPAddress addressIPv6, int port, bool m
if (!BindSocket(_udpSocketv4, new IPEndPoint(addressIPv4, port)))
return false;

LocalPort = ((IPEndPoint) _udpSocketv4.LocalEndPoint).Port;
LocalPort = ((IPEndPoint)_udpSocketv4.LocalEndPoint).Port;

#if UNITY_2018_3_OR_NEWER
if (_pausedSocketFix == null)
#if UNITY_SOCKET_FIX
if (_useSocketFix && _pausedSocketFix == null)
_pausedSocketFix = new PausedSocketFix(this, addressIPv4, addressIPv6, port, manualMode);
#endif

Expand Down Expand Up @@ -404,7 +408,7 @@ private bool BindSocket(Socket socket, IPEndPoint ep)
{
try
{
socket.IOControl(SioUdpConnreset, new byte[] {0}, null);
socket.IOControl(SioUdpConnreset, new byte[] { 0 }, null);
}
catch
{
Expand Down Expand Up @@ -452,7 +456,7 @@ private bool BindSocket(Socket socket, IPEndPoint ep)
{
try
{
#if !UNITY_2018_3_OR_NEWER
#if !UNITY_SOCKET_FIX
socket.SetSocketOption(
SocketOptionLevel.IPv6,
SocketOptionName.AddMembership,
Expand Down
84 changes: 51 additions & 33 deletions LiteNetLib/NetManager.cs
Original file line number Diff line number Diff line change
@@ -1,4 +1,7 @@
using System;
#if UNITY_SOCKET_FIX
#define UNITY_SOCKET_FIX
#endif
using System;
using System.Collections;
using System.Collections.Concurrent;
using System.Collections.Generic;
Expand Down Expand Up @@ -353,14 +356,26 @@ public List<NetPeer> ConnectedPeerList
public int ConnectedPeersCount => (int)Interlocked.Read(ref _connectedPeersCount);

public int ExtraPacketSizeForLayer => _extraPacketLayer?.ExtraPacketSizeForLayer ?? 0;
public NetManager(bool useSocketFix = true)
{
#if UNITY_SOCKET_FIX
_useSocketFix = useSocketFix;
#endif
}

/// <summary>
/// NetManager constructor
/// </summary>
/// <param name="listener">Network events listener (also can implement IDeliveryEventListener)</param>
/// <param name="extraPacketLayer">Extra processing of packages, like CRC checksum or encryption. All connected NetManagers must have same layer.</param>
#if UNITY_SOCKET_FIX
public NetManager(INetEventListener listener, PacketLayerBase extraPacketLayer = null, bool useSocketFix = true)
{
_useSocketFix = useSocketFix;
#else
public NetManager(INetEventListener listener, PacketLayerBase extraPacketLayer = null)
{
#endif
_netEventListener = listener;
_deliveryEventListener = listener as IDeliveryEventListener;
_ntpEventListener = listener as INtpEventListener;
Expand All @@ -376,7 +391,7 @@ internal void ConnectionLatencyUpdated(NetPeer fromPeer, int latency)

internal void MessageDelivered(NetPeer fromPeer, object userData)
{
if(_deliveryEventListener != null)
if (_deliveryEventListener != null)
CreateEvent(NetEvent.EType.MessageDelivered, fromPeer, userData: userData);
}

Expand All @@ -401,7 +416,7 @@ private void DisconnectPeer(
var shutdownResult = peer.Shutdown(data, start, count, force);
if (shutdownResult == ShutdownResult.None)
return;
if(shutdownResult == ShutdownResult.WasConnected)
if (shutdownResult == ShutdownResult.WasConnected)
Interlocked.Decrement(ref _connectedPeersCount);
CreateEvent(
NetEvent.EType.Disconnect,
Expand Down Expand Up @@ -432,7 +447,7 @@ private void CreateEvent(
else if (type == NetEvent.EType.MessageDelivered)
unsyncEvent = UnsyncedDeliveryEvent;

lock(_eventLock)
lock (_eventLock)
{
evt = _netEventPoolHead;
if (evt == null)
Expand Down Expand Up @@ -523,7 +538,7 @@ private void ProcessEvent(NetEvent evt)
_peersLock.ExitWriteLock();
}
_peersLock.ExitUpgradeableReadLock();
if(previousAddress != null && _peerAddressChangedListener != null)
if (previousAddress != null && _peerAddressChangedListener != null)
_peerAddressChangedListener.OnPeerAddressChanged(evt.Peer, previousAddress);
break;
}
Expand All @@ -540,7 +555,7 @@ internal void RecycleEvent(NetEvent evt)
evt.ErrorCode = 0;
evt.RemoteEndPoint = null;
evt.ConnectionRequest = null;
lock(_eventLock)
lock (_eventLock)
{
evt.Next = _netEventPoolHead;
_netEventPoolHead = evt;
Expand Down Expand Up @@ -631,7 +646,7 @@ private void ProcessNtpRequests(float elapsedMilliseconds)
foreach (var ntpRequest in _ntpRequests)
{
ntpRequest.Value.Send(_udpSocketv4, elapsedMilliseconds);
if(ntpRequest.Value.NeedToKill)
if (ntpRequest.Value.NeedToKill)
{
if (requestsToRemove == null)
requestsToRemove = new List<IPEndPoint>();
Expand Down Expand Up @@ -693,27 +708,27 @@ internal NetPeer OnConnectionSolved(ConnectionRequest request, byte[] rejectData
_requestsDict.Remove(request.RemoteEndPoint);
}
else lock (_requestsDict)
{
if (TryGetPeer(request.RemoteEndPoint, out netPeer))
{
//already have peer
}
else if (request.Result == ConnectionRequestResult.Reject)
{
netPeer = new NetPeer(this, request.RemoteEndPoint, GetNextPeerId());
netPeer.Reject(request.InternalPacket, rejectData, start, length);
AddPeer(netPeer);
NetDebug.Write(NetLogLevel.Trace, "[NM] Peer connect reject.");
}
else //Accept
{
netPeer = new NetPeer(this, request, GetNextPeerId());
AddPeer(netPeer);
CreateEvent(NetEvent.EType.Connect, netPeer);
NetDebug.Write(NetLogLevel.Trace, $"[NM] Received peer connection Id: {netPeer.ConnectTime}, EP: {netPeer}");
if (TryGetPeer(request.RemoteEndPoint, out netPeer))
{
//already have peer
}
else if (request.Result == ConnectionRequestResult.Reject)
{
netPeer = new NetPeer(this, request.RemoteEndPoint, GetNextPeerId());
netPeer.Reject(request.InternalPacket, rejectData, start, length);
AddPeer(netPeer);
NetDebug.Write(NetLogLevel.Trace, "[NM] Peer connect reject.");
}
else //Accept
{
netPeer = new NetPeer(this, request, GetNextPeerId());
AddPeer(netPeer);
CreateEvent(NetEvent.EType.Connect, netPeer);
NetDebug.Write(NetLogLevel.Trace, $"[NM] Received peer connection Id: {netPeer.ConnectTime}, EP: {netPeer}");
}
_requestsDict.Remove(request.RemoteEndPoint);
}
_requestsDict.Remove(request.RemoteEndPoint);
}

return netPeer;
}
Expand Down Expand Up @@ -756,7 +771,7 @@ private void ProcessConnectRequest(
}
//ConnectRequestResult.NewConnection
//Set next connection number
if(processResult != ConnectRequestResult.P2PLose)
if (processResult != ConnectRequestResult.P2PLose)
connRequest.ConnectionNumber = (byte)((netPeer.ConnectionNum + 1) % NetConstants.MaxConnectionNumber);
//To reconnect peer
}
Expand Down Expand Up @@ -1025,7 +1040,7 @@ private void HandleMessageReceived(NetPacket packet, IPEndPoint remoteEndPoint)
CreateEvent(NetEvent.EType.Connect, netPeer);
break;
default:
if(peerFound)
if (peerFound)
netPeer.ProcessPacket(packet);
else
SendRawAndRecycle(PoolGetWithProperty(PacketProperty.PeerNotFound), remoteEndPoint);
Expand Down Expand Up @@ -1547,7 +1562,7 @@ public NetPeer Connect(IPEndPoint target, NetDataWriter connectionData)
if (!IsRunning)
throw new InvalidOperationException("Client is not running");

lock(_requestsDict)
lock (_requestsDict)
{
if (_requestsDict.ContainsKey(target))
return null;
Expand Down Expand Up @@ -1593,13 +1608,16 @@ public void Stop(bool sendDisconnectMessages)
return;
NetDebug.Write("[NM] Stop");

#if UNITY_2018_3_OR_NEWER
_pausedSocketFix.Deinitialize();
_pausedSocketFix = null;
#if UNITY_SOCKET_FIX
if (_useSocketFix)
{
_pausedSocketFix.Deinitialize();
_pausedSocketFix = null;
}
#endif

//Send last disconnect
for(var netPeer = _headPeer; netPeer != null; netPeer = netPeer.NextPeer)
for (var netPeer = _headPeer; netPeer != null; netPeer = netPeer.NextPeer)
netPeer.Shutdown(null, 0, 0, !sendDisconnectMessages);

//Stop
Expand Down

0 comments on commit 76f91b5

Please sign in to comment.