This commit is contained in:
Bluzume 2021-11-05 07:24:05 -04:00
parent 9ea1cd587b
commit c41364ab9e
2 changed files with 35 additions and 114 deletions

View file

@ -75,7 +75,6 @@ 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, 0, workBuffer.Length); evt.SetBuffer(workBuffer, 0, workBuffer.Length);
@ -87,16 +86,12 @@ namespace HISP.Server
public static void CreateClient(object sender, SocketAsyncEventArgs e) public static void CreateClient(object sender, SocketAsyncEventArgs e)
{ {
restart2:; do
Socket eSocket = e.AcceptSocket;
new GameClient(eSocket);
SocketAsyncEventArgs evt = new SocketAsyncEventArgs();
evt.Completed += GameClient.CreateClient;
if (!GameServer.ServerSocket.AcceptAsync(evt))
{ {
e = evt; Socket eSocket = e.AcceptSocket;
goto restart2; new GameClient(eSocket);
} e.AcceptSocket = null;
} while (!GameServer.ServerSocket.AcceptAsync(e));
} }
public void Disconnect() public void Disconnect()
@ -127,120 +122,47 @@ namespace HISP.Server
private void receivePackets(object sender, SocketAsyncEventArgs e) private void receivePackets(object sender, SocketAsyncEventArgs e)
{ {
restart:; do
// HI1 Packets are terminates by 0x00 so we have to read until we receive that terminator
if (!ClientSocket.Connected)
{ {
Disconnect(); // HI1 Packets are terminates by 0x00 so we have to read until we receive that terminator
return;
}
if(e.SocketError != SocketError.Success)
{
Disconnect();
return;
}
if (!ClientSocket.Connected)
int availble = e.BytesTransferred;
if (availble >= 1)
{
for (int i = 0; i < availble; i++)
{
currentPacket.Add(e.Buffer[i]);
if (e.Buffer[i] == PacketBuilder.PACKET_TERMINATOR)
{
parsePackets(currentPacket.ToArray());
currentPacket.Clear();
}
}
}
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()
{
// Cant outright stop threads anymore in .NET core,
// Lets just let the thread stop gracefully.
this.isDisconnecting = true;
}
private bool receivePackets()
{
// HI1 Packets are terminates by 0x00 so we have to read until we receive that terminator
Logger.DebugPrint("Reciving Packets...");
while (ClientSocket.Connected && !isDisconnecting)
{
if (isDisconnecting)
break;
try
{
int availble = ClientSocket.Available;
if (availble >= 1)
{
byte[] buffer = new byte[availble];
ClientSocket.Receive(buffer);
for (int i = 0; i < availble; i++)
{
currentPacket.Add(buffer[i]);
if (buffer[i] == PacketBuilder.PACKET_TERMINATOR)
{
parsePackets(currentPacket.ToArray());
currentPacket.Clear();
}
}
}
}
catch (SocketException)
{ {
Disconnect(); Disconnect();
break; return;
} }
} if (e.SocketError != SocketError.Success)
{
Disconnect();
return;
}
// Stop Timers int availble = e.BytesTransferred;
if (inactivityTimer != null) if (availble >= 1)
inactivityTimer.Dispose(); {
if (warnTimer != null)
warnTimer.Dispose();
if (kickTimer != null)
kickTimer.Dispose();
// Call OnDisconnect for (int i = 0; i < availble; i++)
connectedClients.Remove(this); {
GameServer.OnDisconnect(this); currentPacket.Add(e.Buffer[i]);
LoggedIn = false; if (e.Buffer[i] == PacketBuilder.PACKET_TERMINATOR)
{
parsePackets(currentPacket.ToArray());
currentPacket.Clear();
}
}
}
// Close Socket if (isDisconnecting)
ClientSocket.Close(); return;
ClientSocket.Dispose();
} while (!ClientSocket.ReceiveAsync(e));
return isDisconnecting; // Stop the task.
} }
*/
private void minuteTimerTick(object state) private void minuteTimerTick(object state)
{ {
totalMinutesElapsed++; totalMinutesElapsed++;

View file

@ -8099,8 +8099,7 @@ namespace HISP.Server
SocketAsyncEventArgs e = new SocketAsyncEventArgs(); SocketAsyncEventArgs e = new SocketAsyncEventArgs();
e.Completed += GameClient.CreateClient; e.Completed += GameClient.CreateClient;
if (!ServerSocket.AcceptAsync(e)) GameClient.CreateClient(null, e);
GameClient.CreateClient(null, e);
} }
} }