Fix Async Packet Read

This commit is contained in:
Bluzume 2021-11-05 07:05:59 -04:00
parent 369989ad59
commit 9ea1cd587b
2 changed files with 39 additions and 69 deletions

View file

@ -577,45 +577,6 @@ namespace HISP.Player
} }
// Players now offscreen tell the client is at 1000,1000. // Players now offscreen tell the client is at 1000,1000.
/* foreach (User onScreenBeforeUser in onScreenBefore)
{
bool found = false;
foreach (User onScreenNowUser in onScreenNow)
{
if (onScreenNowUser.Id == onScreenBeforeUser.Id)
{
found = true;
break;
}
}
if (!found)
{
byte[] playerInfoBytes = PacketBuilder.CreatePlayerInfoUpdateOrCreate(1000 + 4, 1000 + 1, Facing, CharacterId, Username);
onScreenBeforeUser.LoggedinClient.SendPacket(playerInfoBytes);
}
}
// Players now onscreen tell the client there real pos
foreach (User onScreenNowUser in onScreenNow)
{
bool found = false;
foreach (User onScreenBeforeUser in onScreenBefore)
{
if (onScreenNowUser.Id == onScreenBeforeUser.Id)
{
found = true;
break;
}
}
if (!found)
{
byte[] playerInfoBytes = PacketBuilder.CreatePlayerInfoUpdateOrCreate(onScreenNowUser.X, onScreenNowUser.Y, onScreenNowUser.Facing, onScreenNowUser.CharacterId, onScreenNowUser.Username);
LoggedinClient.SendPacket(playerInfoBytes);
}
}
*/
GameServer.Update(LoggedinClient); GameServer.Update(LoggedinClient);
} }

View file

@ -1,5 +1,4 @@
using System; using System;
using System.IO;
using System.Net.Sockets; using System.Net.Sockets;
using System.Text; using System.Text;
using System.Threading; using System.Threading;
@ -76,27 +75,30 @@ namespace HISP.Server
connectedClients.Add(this); connectedClients.Add(this);
/*
SocketAsyncEventArgs evt = new SocketAsyncEventArgs(); SocketAsyncEventArgs evt = new SocketAsyncEventArgs();
evt.Completed += receivePackets; evt.Completed += receivePackets;
evt.SetBuffer(workBuffer); evt.SetBuffer(workBuffer, 0, workBuffer.Length);
clientSocket.ReceiveAsync(evt); if (!clientSocket.ReceiveAsync(evt))
*/ {
receivePackets(); receivePackets(null, evt);
}
} }
public static void CreateClient(object sender, SocketAsyncEventArgs e) public static void CreateClient(object sender, SocketAsyncEventArgs e)
{ {
restart:; restart2:;
Socket eSocket = e.AcceptSocket; Socket eSocket = e.AcceptSocket;
e.AcceptSocket = null;
if (!GameServer.ServerSocket.AcceptAsync(e))
goto restart;
new GameClient(eSocket); new GameClient(eSocket);
SocketAsyncEventArgs evt = new SocketAsyncEventArgs();
evt.Completed += GameClient.CreateClient;
if (!GameServer.ServerSocket.AcceptAsync(evt))
{
e = evt;
goto restart2;
}
} }
/*
public void Disconnect() public void Disconnect()
{ {
this.isDisconnecting = true; this.isDisconnecting = true;
@ -125,7 +127,7 @@ namespace HISP.Server
private void receivePackets(object sender, SocketAsyncEventArgs e) private void receivePackets(object sender, SocketAsyncEventArgs e)
{ {
restart:;
// HI1 Packets are terminates by 0x00 so we have to read until we receive that terminator // HI1 Packets are terminates by 0x00 so we have to read until we receive that terminator
if (!ClientSocket.Connected) if (!ClientSocket.Connected)
@ -140,32 +142,39 @@ namespace HISP.Server
return; return;
} }
if (!isDisconnecting)
int availble = e.BytesTransferred;
if (availble >= 1)
{ {
int availble = e.BytesTransferred; for (int i = 0; i < availble; i++)
if (availble >= 1)
{ {
currentPacket.Add(e.Buffer[i]);
for (int i = 0; i < availble; i++) if (e.Buffer[i] == PacketBuilder.PACKET_TERMINATOR)
{ {
currentPacket.Add(e.Buffer[i]); parsePackets(currentPacket.ToArray());
if (e.Buffer[i] == PacketBuilder.PACKET_TERMINATOR) currentPacket.Clear();
{
parsePackets(currentPacket.ToArray());
currentPacket.Clear();
}
} }
} }
ClientSocket.ReceiveAsync(e);
return;
} }
if (isDisconnecting)
return;
SocketAsyncEventArgs evt = new SocketAsyncEventArgs();
evt.Completed += receivePackets;
evt.SetBuffer(workBuffer, 0, workBuffer.Length);
if (ClientSocket != null && !ClientSocket.ReceiveAsync(evt))
{
e = evt;
goto restart;
}
} }
*/
public void Disconnect() /* public void Disconnect()
{ {
// Cant outright stop threads anymore in .NET core, // Cant outright stop threads anymore in .NET core,
@ -231,7 +240,7 @@ namespace HISP.Server
return isDisconnecting; // Stop the task. return isDisconnecting; // Stop the task.
} }
*/
private void minuteTimerTick(object state) private void minuteTimerTick(object state)
{ {
totalMinutesElapsed++; totalMinutesElapsed++;