FurinaImpact/FurinaImpact.Kcp/KcpSocketTransportForMultiplexConnection.cs

41 lines
1.5 KiB
C#
Raw Permalink Normal View History

2023-12-09 03:45:08 +00:00
using System.Net.Sockets;
namespace FurinaImpact.Kcp
{
internal sealed class KcpSocketTransportForMultiplexConnection<T> : KcpSocketTransport<KcpMultiplexConnection<T>>, IKcpTransport<IKcpMultiplexConnection<T>>
{
private readonly Action<T?> _disposeAction;
private Func<Exception, IKcpTransport<IKcpMultiplexConnection<T>>, object, bool> _exceptionHandler;
private object _exceptionHandlerState;
internal KcpSocketTransportForMultiplexConnection(UdpClient listener, int mtu)
: base(listener, mtu)
{ }
internal KcpSocketTransportForMultiplexConnection(UdpClient listener, int mtu, Action<T?> disposeAction)
: base(listener, mtu)
{
_disposeAction = disposeAction;
}
protected override KcpMultiplexConnection<T> Activate() => new KcpMultiplexConnection<T>(this, _disposeAction);
IKcpMultiplexConnection<T> IKcpTransport<IKcpMultiplexConnection<T>>.Connection => Connection;
protected override bool HandleException(Exception ex)
{
if (_exceptionHandler is not null)
{
return _exceptionHandler.Invoke(ex, this, _exceptionHandlerState);
}
return false;
}
public void SetExceptionHandler(Func<Exception, IKcpTransport<IKcpMultiplexConnection<T>>, object, bool> handler, object state)
{
_exceptionHandler = handler;
_exceptionHandlerState = state;
}
}
}