2016-04-05 6 views
1

Ich habe gerade meinen C# -Proxy beendet, der 2 Sockets enthält (ein Client-Socket empfängt Daten von einem bestimmten Client, ein Server-Socket empfängt Daten von einem bestimmten Server).2 Threads, die Sockets mit merkwürdigem Verhalten behandeln

- Methode I)

Die voll funktionsfähiges/Verfahren aus einer früheren frühen Alpha-Version verwendet die folgenden Speicher Essen, schnelle und schmutzige Methode implementieren Ich werde nicht wieder senden erhalten:

  while (true) 
      { 
       if (ClientSocket.Available > 0) 
       { 
        // Received data from the game client 
        byte[] buf = new byte[ClientSocket.Available]; 
        ClientSocket.Receive(buf); 
        Packet p = new Packet(buf); 
        Logger.Log(p.ID, LogType.PACKET); 
        // Forward re-encrypted data back to the official server 
        ServerSocket.Send(p.Encrypt()); 
       } 

       if (ServerSocket.Available > 0) 
       { 
        // Received Data from the official server 
        byte[] buf = new byte[ServerSocket.Available]; 
        ServerSocket.Receive(buf); 
        Packet p = new Packet(buf); 
        Logger.Log(p.ID, LogType.PACKET); 
        // Forward re-encrypted data back to the game client 
        ClientSocket.Send(p.Encrypt()); 
       } 
      } 

- Verfahren II)

Die nicht Arbeits empfangen/Verfahren aus der aktuellen Version verwendet die folgenden Speicherfreundliche Methode aufgeteilt in 2 Fäden senden:

class ClientReceiveThread 
{ 
    public Thread T { get; set; } 
    public ClientReceiveThread(Socket ClientSocket, Socket ServerSocket) 
    { 
     T = new Thread(() => 
     { 
      try 
      {    
       while (ClientSocket.Available > 0) 
       { 
        // Received data from the game client 
        byte[] buf = new byte[ClientSocket.Available]; 
        ClientSocket.Receive(buf); 
        Packet p = new Packet(buf); 
        Logger.Log(p.ID, LogType.PACKET); 
        // Forward re-encrypted data back to the official server 
        ServerSocket.Send(p.Encrypt()); 
       } 
      } 
      catch (Exception e) 
      { 
       ExceptionHandler.Handle(e); 
      } 
     }); 
     T.Start(); 
    } 
} 

class ServerReceiveThread 
{ 
    public Thread T { get; set; } 
    public ServerReceiveThread(Socket ClientSocket, Socket ServerSocket) 
    { 
     T = new Thread(() => 
     { 
      try 
      { 
       while (ServerSocket.Available > 0) 
       { 
        // Received Data from the official server 
        byte[] buf = new byte[ServerSocket.Available]; 
        ServerSocket.Receive(buf); 
        Packet p = new Packet(buf); 
        Logger.Log(p.ID, LogType.PACKET); 
        // Forward re-encrypted data back to the game client 
        ClientSocket.Send(p.Encrypt()); 
       } 
      } 
      catch (Exception e) 
      { 
       ExceptionHandler.Handle(e); 
      } 
     }); 
     T.Start(); 
    } 
} 

Methode I) macht insofern Arbeit, die sowohl client- und Serversockets Daten empfangen, während Methode II) empfängt nur Daten von ClientReceiveThread. Warum empfängt ServerReceiveThread in Methode II) keine Daten? Es ist im Grunde der gleiche Code wie in der while(true) Schleife, nur auf einen separaten Thread portiert.

Alle Vorschläge oder Antworten werden sehr geschätzt. Vielen Dank im Voraus!

+0

zur eigentlichen Frage Unrelated. Sehen Sie sich die Task Parallel Library anstelle von Threads an. – KDecker

Antwort

1

es behoben, durch den "Verfügbar" Eigentum zu vermeiden:

class ClientReceiveThread 
{ 
    public Thread T { get; set; } 
    public ClientReceiveThread(Socket ClientSocket, Socket ServerSocket) 
    { 
     T = new Thread(() => 
     { 
      try 
      {    
       byte[] buf = new byte[1024]; 
       while (ClientSocket.Receive(buf) > 0) 
       { 
        // Received data from the game client 
        Packet p = new Packet(buf); 
        Logger.Log(p.ID, LogType.PACKET); 
        // Forward re-encrypted data back to the official server 
        ServerSocket.Send(p.Encrypt()); 
       } 
      } 
      catch (Exception e) 
      { 
       ExceptionHandler.Handle(e); 
      } 
     }); 
     T.Start(); 
    } 
} 

class ServerReceiveThread 
{ 
    public Thread T { get; set; } 
    public ServerReceiveThread(Socket ClientSocket, Socket ServerSocket) 
    { 
     T = new Thread(() => 
     { 
      try 
      { 
       byte[] buf = new byte[1024]; 
       while (ServerSocket.Receive(buf) > 0) 
       { 
        // Received Data from the official server 
        Packet p = new Packet(buf); 
        Logger.Log(p.ID, LogType.PACKET); 
        // Forward re-encrypted data back to the game client 
        ClientSocket.Send(p.Encrypt()); 
       } 
      } 
      catch (Exception e) 
      { 
       ExceptionHandler.Handle(e); 
      } 
     }); 
     T.Start(); 
    } 
} 
Verwandte Themen