-
-
Notifications
You must be signed in to change notification settings - Fork 13
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
Showing
51 changed files
with
8,569 additions
and
43 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Binary file not shown.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,52 @@ | ||
using System.Collections.Generic; | ||
using System.Threading; | ||
|
||
namespace CP_SDK_LiteNetLib | ||
{ | ||
internal abstract class BaseChannel | ||
{ | ||
protected readonly NetPeer Peer; | ||
protected readonly Queue<NetPacket> OutgoingQueue; | ||
private int _isAddedToPeerChannelSendQueue; | ||
|
||
public int PacketsInQueue | ||
{ | ||
get { return OutgoingQueue.Count; } | ||
} | ||
|
||
protected BaseChannel(NetPeer peer) | ||
{ | ||
Peer = peer; | ||
OutgoingQueue = new Queue<NetPacket>(64); | ||
} | ||
|
||
public void AddToQueue(NetPacket packet) | ||
{ | ||
lock (OutgoingQueue) | ||
{ | ||
OutgoingQueue.Enqueue(packet); | ||
} | ||
AddToPeerChannelSendQueue(); | ||
} | ||
|
||
protected void AddToPeerChannelSendQueue() | ||
{ | ||
if (Interlocked.CompareExchange(ref _isAddedToPeerChannelSendQueue, 1, 0) == 0) | ||
{ | ||
Peer.AddToReliableChannelSendQueue(this); | ||
} | ||
} | ||
|
||
public bool SendAndCheckQueue() | ||
{ | ||
bool hasPacketsToSend = SendNextPackets(); | ||
if (!hasPacketsToSend) | ||
Interlocked.Exchange(ref _isAddedToPeerChannelSendQueue, 0); | ||
|
||
return hasPacketsToSend; | ||
} | ||
|
||
protected abstract bool SendNextPackets(); | ||
public abstract bool ProcessPacket(NetPacket packet); | ||
} | ||
} |
137 changes: 137 additions & 0 deletions
137
BeatSaberPlus/CP_SDK/Network/LiteNetLib/ConnectionRequest.cs
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,137 @@ | ||
using System.Net; | ||
using System.Threading; | ||
using CP_SDK_LiteNetLib.Utils; | ||
|
||
namespace CP_SDK_LiteNetLib | ||
{ | ||
internal enum ConnectionRequestResult | ||
{ | ||
None, | ||
Accept, | ||
Reject, | ||
RejectForce | ||
} | ||
|
||
public class ConnectionRequest | ||
{ | ||
private readonly NetManager _listener; | ||
private int _used; | ||
|
||
public readonly NetDataReader Data; | ||
|
||
internal ConnectionRequestResult Result { get; private set; } | ||
internal long ConnectionTime; | ||
internal byte ConnectionNumber; | ||
public readonly IPEndPoint RemoteEndPoint; | ||
|
||
private bool TryActivate() | ||
{ | ||
return Interlocked.CompareExchange(ref _used, 1, 0) == 0; | ||
} | ||
|
||
internal void UpdateRequest(NetConnectRequestPacket connRequest) | ||
{ | ||
if (connRequest.ConnectionTime >= ConnectionTime) | ||
{ | ||
ConnectionTime = connRequest.ConnectionTime; | ||
ConnectionNumber = connRequest.ConnectionNumber; | ||
} | ||
} | ||
|
||
internal ConnectionRequest( | ||
long connectionId, | ||
byte connectionNumber, | ||
NetDataReader netDataReader, | ||
IPEndPoint endPoint, | ||
NetManager listener) | ||
{ | ||
ConnectionTime = connectionId; | ||
ConnectionNumber = connectionNumber; | ||
RemoteEndPoint = endPoint; | ||
Data = netDataReader; | ||
_listener = listener; | ||
} | ||
|
||
public NetPeer AcceptIfKey(string key) | ||
{ | ||
if (!TryActivate()) | ||
return null; | ||
try | ||
{ | ||
if (Data.GetString() == key) | ||
Result = ConnectionRequestResult.Accept; | ||
} | ||
catch | ||
{ | ||
//NetDebug.WriteError("[AC] Invalid incoming data"); | ||
} | ||
if (Result == ConnectionRequestResult.Accept) | ||
return _listener.OnConnectionSolved(this, null, 0, 0); | ||
|
||
Result = ConnectionRequestResult.Reject; | ||
_listener.OnConnectionSolved(this, null, 0, 0); | ||
return null; | ||
} | ||
|
||
/// <summary> | ||
/// Accept connection and get new NetPeer as result | ||
/// </summary> | ||
/// <returns>Connected NetPeer</returns> | ||
public NetPeer Accept() | ||
{ | ||
if (!TryActivate()) | ||
return null; | ||
Result = ConnectionRequestResult.Accept; | ||
return _listener.OnConnectionSolved(this, null, 0, 0); | ||
} | ||
|
||
public void Reject(byte[] rejectData, int start, int length, bool force) | ||
{ | ||
if (!TryActivate()) | ||
return; | ||
Result = force ? ConnectionRequestResult.RejectForce : ConnectionRequestResult.Reject; | ||
_listener.OnConnectionSolved(this, rejectData, start, length); | ||
} | ||
|
||
public void Reject(byte[] rejectData, int start, int length) | ||
{ | ||
Reject(rejectData, start, length, false); | ||
} | ||
|
||
|
||
public void RejectForce(byte[] rejectData, int start, int length) | ||
{ | ||
Reject(rejectData, start, length, true); | ||
} | ||
|
||
public void RejectForce() | ||
{ | ||
Reject(null, 0, 0, true); | ||
} | ||
|
||
public void RejectForce(byte[] rejectData) | ||
{ | ||
Reject(rejectData, 0, rejectData.Length, true); | ||
} | ||
|
||
public void RejectForce(NetDataWriter rejectData) | ||
{ | ||
Reject(rejectData.Data, 0, rejectData.Length, true); | ||
} | ||
|
||
public void Reject() | ||
{ | ||
Reject(null, 0, 0, false); | ||
} | ||
|
||
public void Reject(byte[] rejectData) | ||
{ | ||
Reject(rejectData, 0, rejectData.Length, false); | ||
} | ||
|
||
public void Reject(NetDataWriter rejectData) | ||
{ | ||
Reject(rejectData.Data, 0, rejectData.Length, false); | ||
} | ||
} | ||
} |
Oops, something went wrong.