2009-03-02 6 views
0

Ein paar Worte über einen laufenden Entwurf und die ImplementierungVernetzungsdesign; Socket-Kommunikation unter Verwendung von Polling

ich viele Anfragen an die Remote-Anwendung sende (läuft auf einer anderen Host, natürlich), und die Anwendungsdaten zurückzuschicken.

Über Client

Client ist eine Benutzeroberfläche, die einen separaten Thread laichen die Anträge einzureichen und zu verarbeiten. Sobald alle Anforderungen gesendet wurden, wird Wait aufgerufen. Und das Warten analysiert alle Ereignisse, die von der App kommen, und ruft die Callbacks des Clients auf.

Unten ist die Implementierung von Wait.

public void Wait (uint milliseconds) 
{ 
     while(_socket.IsConnected) 
     { 
     if (_socket.Poll(milliseconds, SelectMode.SelectRead)) 
     { 
       // read info of the buffer and calls registered callbacks for the client 
       if(_socket.IsAvailable > 0) 
        ProcessSocket(socket); 
     } 
     else 
      return; //returns after Poll has expired 
     } 
} 

Die Warten wird aus einem separaten Thread genannt, verantwortlich für die Verwaltung von Netzwerkverbindung: sowohl eingehender als auch ausgehender Datenverkehr:

  _Receiver = new Thread(DoWork); 
     _Receiver.IsBackground = true; 
     _Receiver.Start(this); 

Dieser Thread aus UI-Komponente der Anwendung erstellt wird.

Die Frage:

Client manchmal Verzögerungen bei den Rückrufen sieht, obwohl Hauptanwendung die Daten rechtzeitig gesendet hat. Bemerkenswert ist, wurde eine die Nachricht in der Abstimmung verzögert, bis ich Client getrennt und intern aufgerufen I:

_socket.Shutdown(SocketShutdown.Both); 

Ich denke, etwas flippig ist in den Poll

Vorschläge, wie geschieht das Problem zu beheben oder eine alternative Problemumgehung?

Dank

lassen Sie es mich wissen, wenn etwas

+0

@Adam Devis - vielen Dank für die Korrektur der Rechtschreibung im Titel. –

Antwort

1

Ein paar Dinge. Erstens, gibt es in Ihrem Beispiel einen Unterschied zwischen "_socket" und "socket"? Zweitens verwenden Sie die System.Net.Sockets.Socket-Klasse, oder? Ich sehe nicht IsConnected oder IsAvailable Eigenschaften für diese Klasse in der MSDN-Dokumentation für alle .NET-Version zurück zu 1.1. Ich nehme an, das sind beide Tippfehler, oder?

Haben Sie versucht, eine „else“ Klausel über die „IsAvailable> 0“ Probe zu stellen und eine Nachricht an die Konsole/Ausgabefenster zu schreiben, zum Beispiel

if (_socket.IsAvailable > 0) { 
     ProcessSocket(socket); 
    } else { 
     Console.WriteLine("Poll() returned true but there is no data"); 
    } 

Dies Sie eine Vorstellung davon, was vielleicht geben könnte gehen Sie im größeren Kontext Ihres Programms weiter.

Abgesehen davon bin ich kein großer Fan von Abfrage-Sockets für Daten. Gibt es als Alternative einen Grund, die asynchronen Begin/EndReceive-Funktionen auf dem Socket nicht zu verwenden? Ich denke, es wäre einfach, in das asynchrone Modell zu konvertieren, da Sie bereits einen separaten Thread zum Senden und Empfangen Ihrer Daten verwenden. Hier ist ein example von MSDN. Außerdem habe ich die typische Implementierung dieses Mechanismus zu this SO post hinzugefügt.

+0

1. typ fehler. 2. IsConnected ist mein Wrapper und IsAvailable ist nur Available. Vielen Dank –

0

Was Faden unklar ist, ist die Wait() -Methode aufrufen? Wenn Sie es nur in den UI-Threadpool werfen, können Sie manchmal Verzögerungen feststellen. Wenn dies Ihr Problem ist, verwenden Sie entweder den Systemthreadpool, erstellen Sie einen neuen nur für die Netzwerkkomponenten Ihrer Anwendung oder erstellen Sie einen dedizierten Thread dafür.

Darüber hinaus ist es schwierig, Ihnen viel zu helfen, ohne mehr Code zu sehen.

+0

Nun, ich erstelle einen separaten Thread, der die Verarbeitung übernimmt und in der Tat für das Aufrufen von Wait verantwortlich ist. Ich werde zeigen, wie ich den obigen Thread erstelle. danke –