using linker.libs.extends;
using System.Buffers;
using System.Net;
using System.Net.Sockets;
namespace linker.messenger.relay.server
{
///
/// 中继节点报告处理器
///
public class RelayServerReportResolver: IResolver
{
public ResolverType Type => ResolverType.RelayReport;
private readonly RelayServerMasterTransfer relayServerTransfer;
public RelayServerReportResolver(RelayServerMasterTransfer relayServerTransfer)
{
this.relayServerTransfer = relayServerTransfer;
}
public virtual void AddReceive(ulong bytes)
{
}
public virtual void AddSendt(ulong bytes)
{
}
public async Task Resolve(Socket socket, Memory memory)
{
byte[] buffer = ArrayPool.Shared.Rent(1024);
try
{
AddReceive((ulong)memory.Length);
int length = await socket.ReceiveAsync(buffer.AsMemory(), SocketFlags.None).ConfigureAwait(false);
AddReceive((ulong)length);
string key = buffer.AsMemory(0,length).GetString();
Memory bytes = relayServerTransfer.TryGetRelayCache(key);
if (bytes.Length > 0)
{
AddSendt((ulong)bytes.Length);
await socket.SendAsync(bytes);
}
}
catch (Exception)
{
}
finally
{
ArrayPool.Shared.Return(buffer);
}
}
public async Task Resolve(Socket socket, IPEndPoint ep, Memory memory)
{
AddReceive((ulong)memory.Length);
relayServerTransfer.SetNodeReport(ep, memory);
await Task.CompletedTask;
}
}
}