120 lines
2.9 KiB
C#
120 lines
2.9 KiB
C#
using System.Diagnostics;
|
|
using ClientTester.Packet;
|
|
using LiteNetLib;
|
|
using LiteNetLib.Utils;
|
|
using Serilog;
|
|
|
|
namespace ClientTester.EchoDummyService;
|
|
|
|
public class DummyClients
|
|
{
|
|
public NetManager manager;
|
|
public EventBasedNetListener listener;
|
|
public NetPeer? peer;
|
|
public int clientId;
|
|
|
|
// seq → 송신 타임스탬프 (Stopwatch tick)
|
|
private readonly Dictionary<int, long> pendingPings = new();
|
|
private int seqNumber;
|
|
|
|
// 통계
|
|
public int SentCount
|
|
{
|
|
set;
|
|
get;
|
|
}
|
|
public int ReceivedCount
|
|
{
|
|
set;
|
|
get;
|
|
}
|
|
public double LastRttMs
|
|
{
|
|
set;
|
|
get;
|
|
}
|
|
public double TotalRttMs
|
|
{
|
|
set;
|
|
get;
|
|
}
|
|
public int RttCount
|
|
{
|
|
set;
|
|
get;
|
|
}
|
|
|
|
public DummyClients(int clientId, string ip, int port, string key)
|
|
{
|
|
this.clientId = clientId;
|
|
listener = new EventBasedNetListener();
|
|
manager = new NetManager(listener);
|
|
|
|
listener.PeerConnectedEvent += netPeer =>
|
|
{
|
|
peer = netPeer;
|
|
Log.Information("[Client {ClientId:00}] 연결됨", this.clientId);
|
|
};
|
|
|
|
listener.NetworkReceiveEvent += (peer, reader, channel, deliveryMethod) =>
|
|
{
|
|
string? msg = reader.GetString();
|
|
|
|
string[] parts = msg.Split(':');
|
|
if (parts.Length == 3 && parts[0] == "ack" && parts[1] == "seq" && int.TryParse(parts[2], out int seq) && pendingPings.TryGetValue(seq, out long sentTick))
|
|
{
|
|
double rttMs = (Stopwatch.GetTimestamp() - sentTick) * 1000.0 / Stopwatch.Frequency;
|
|
LastRttMs = rttMs;
|
|
TotalRttMs += rttMs;
|
|
RttCount++;
|
|
pendingPings.Remove(seq);
|
|
}
|
|
|
|
ReceivedCount++;
|
|
reader.Recycle();
|
|
};
|
|
|
|
listener.PeerDisconnectedEvent += (peer, info) =>
|
|
{
|
|
Log.Warning("[Client {ClientId:00}] 연결 끊김: {Reason}", this.clientId, info.Reason);
|
|
this.peer = null;
|
|
};
|
|
|
|
manager.Start();
|
|
manager.Connect(ip, port, key);
|
|
}
|
|
|
|
public void SendPing()
|
|
{
|
|
if (peer == null)
|
|
{
|
|
return;
|
|
}
|
|
|
|
int seq = seqNumber++;
|
|
pendingPings[seq] = Stopwatch.GetTimestamp();
|
|
|
|
NetDataWriter writer = new NetDataWriter();
|
|
PacketHeader packetHeader = new PacketHeader();
|
|
packetHeader.Code = 0;
|
|
packetHeader.BodyLength = $"seq:{seq}".Length;
|
|
writer.Put((short)packetHeader.Code);
|
|
writer.Put((short)packetHeader.BodyLength);
|
|
writer.Put($"Echo seq:{seq}");
|
|
peer.Send(writer, DeliveryMethod.ReliableOrdered);
|
|
SentCount++;
|
|
}
|
|
|
|
public double AvgRttMs => RttCount > 0 ? TotalRttMs / RttCount : 0.0;
|
|
|
|
public void PollEvents()
|
|
{
|
|
manager.PollEvents();
|
|
}
|
|
|
|
public void Stop()
|
|
{
|
|
manager.Stop();
|
|
}
|
|
}
|