C# / Network: Wie kann man eine Void ausführen wenn ein Socket disconnected?

Ich versuche eine Void auszuführen, wenn ein Socket von meinem Server disconnected. Aber ich bekomme es einfach nicht hin.

Vorab: Ich habe eine eigene Klasse namens GameClient. Diese beinhaltet einfach nur einen Socket und eine ID. Die ID spielt aber in dem Skript keine Rolle.

Bei Zeile 34. sollte er mir dann ausgeben das der Client disconnected. Aber er geht nicht einmal in das try-catch hinein.

Hier ist mein momentanes Serverskript:

_serversocket.Bind(new IPEndPoint(IPAddress.Any, this.Port));
_serversocket.Listen(0);
_serversocket.BeginAccept(AcceptCallback, null);

private void AcceptCallback(IAsyncResult ar)
{
  if (!this.AllowConnection && !(clientlist.Count < this.maxClients)) return;

  GameClient client = new GameClient();

  try
  {
    client._socket = _serversocket.EndAccept(ar);
  }
  catch (ObjectDisposedException)
  {
    client.DestroySelf();
    return;
  }

  client._socket.BeginReceive(buffer, 0, BUFFER_SIZE, SocketFlags.None, ReceiveCallback, client);
  OnClientJoin(client);
  _serversocket.BeginAccept(AcceptCallback, null);
}

private void ReceiveCallback(IAsyncResult ar)
{
  GameClient client = ar.AsyncState as GameClient;
  int received;

  try
  {
    received = client._socket.EndReceive(ar);
  }
  catch (SocketException)
  {
    Console.WriteLine("Client disconnected");
    ClientDisconnect(client);
    return;
  }

  byte[] recBuf = new byte[received];
  Array.Copy(buffer, recBuf, received);
  string text = Encoding.ASCII.GetString(recBuf);
  // Text repräsentiert den erhaltenen String des Clients
}

Ich hatte das Ganze schon einmal in einem anderen Skript gemacht. Dort hat es mit dem try-catch funktioniert. Ich habe zum Versuch die Stelle der "Detektion vom Disconnect" exakt wie beim funktionierenden Skript geschrieben, aber es ging nicht.

...zum Beitrag

Ich habe das Problem.

Ich habe vergessen am Ende von ReciveCall erneut nach Nachrichten vom Socket zu checken. Somit hat sich jede Verbindung beim Server nach der ersten nachricht nicht mehr ansprechen lassen.

Am Ende von ReciveCall habe ich folgendes eingefügt

  1. try
  2.       {
  3.         client._socket.BeginReceive(buffer, 0, BUFFER_SIZE, SocketFlags.None, ReceiveCallback, client);
  4.       }
  5.       catch (Exception)
  6.       {
  7.         client.DestroySelf();
  8.       }
...zur Antwort