Hi,
I'm writing a TCP server for a MMORPG Emulator project. We are using your library for our NetworkWrapping (thanks for your work btw)
We got a problem in our current software, sometimes, it happens that the player changes from map A to map B, there is almost nothing "active" on map B, just static objects, so we do send all the informations to the client and no more.
But, our problem is that, looks like the TCP socket is not being flushed correctly because nothing is received on the client side.
We tried to log every packets we received from different TCP clients, nothing were received in that special case
Do you have any recommendation about it ?
No special options on the server side, here is the TcpSession code :
public class WorldServerSession : TcpSession, INetworkSession
{
private readonly IDecrypter _decrypter;
private readonly IEncrypter _encrypter;
private readonly NetworkInformations _networkClient;
private readonly SessionManager _manager;
private IPEndPoint _ip;
public WorldServerSession(TcpServer server, IEncrypter encrypter, IDecrypter decrypter, NetworkInformations networkClient, SessionManager manager) : base(server)
{
_encrypter = encrypter;
_decrypter = decrypter;
_networkClient = networkClient;
_manager = manager;
}
public RegionLanguageType Language
{
get => _networkClient.Language;
set => _networkClient.Language = value;
}
public event EventHandler<string> PacketReceived;
public IPAddress IpAddress => _ip.Address;
public void SendPacketFormat(string packet, params object[] param)
{
SendPacket(string.Format(packet, param));
}
public void SendPackets(IEnumerable<string> packets)
{
if (IsDisposing)
{
return;
}
foreach (string packet in packets)
{
SendPacket(packet);
}
}
public void DisconnectClient()
{
_manager.RemoveSession(this);
Disconnect();
}
public bool IsDisposing { get; set; }
public void SendPacket(string packet)
{
if (IsDisposing)
{
return;
}
try
{
var encrypted = _encrypter.Encode(packet).ToArray();
var send = Send(encrypted);
Logger.Log.Info($"[SENDING] {encrypted.Length} -> [send] {send}");
}
catch (Exception e)
{
Logger.Log.Error("SendPacket", e);
DisconnectClient();
}
}
public int SessionId
{
get => _networkClient.SessionId;
set => _networkClient.SessionId = value;
}
protected override void OnConnected()
{
_ip = Socket.RemoteEndPoint as IPEndPoint;
}
protected override void OnDisconnected()
{
DisconnectClient();
}
protected override void OnReceived(byte[] buffer, long offset, long size)
{
if (IsDisposing)
{
return;
}
string buff = _decrypter.Decode(buffer.AsSpan((int)offset, (int)size));
try
{
PacketReceived?.Invoke(this, buff);
}
catch (Exception e)
{
Disconnect();
Logger.Log.Error("OnReceived", e);
}
}
protected override void OnError(SocketError error)
{
Disconnect();
}
}
Typical inactive map code :
session.SendPacket("mapobjectinfo 1");
session.SendPacket("mapobjectinfo 2");
session.SendPacket("mapobjectinfo 3");
session.SendPacket("mapobjectinfo 4");
session.SendPacket("mapobjectinfo 5");
session.SendPacket("mapobjectinfo 6");
session.SendPacket("mapobjectinfo 7");
session.SendPacket("mapobjectinfo 8");
session.SendPacket("mapobjectinfo 9");
session.SendPacket("mapobjectinfo 10");
session.SendPacket("mapobjectinfo 11");