2016-12-19 4 views
2

Ich entwickle einen Socket-Server und einen Client mit .NET Framework 4.6.2 und C#.Entfernen Sie ausstehende Daten, die nach Socket-Timeout gelesen werden sollen

Client ist SynchronousSocketClient.

Server-Klasse ist mehr oder weniger so one.

Am Client sende ich Daten zur Aktualisierung auf der Datenbank.

Auf dem Server mache ich eine Operation in einer Datenbank (aktualisieren Sie eine Tabelle mit einer gespeicherten Prozedur).

Der Prozess ist Client sendet Daten an Server, Server verarbeitet es und sendet eine Nachricht mit dem Ergebnis zurück.

Manchmal bekommt diese Datenbankoperation mehr Zeit dafür. Wenn diese Zeit größer als Socket.ReceiveTimeout ist, bekomme ich eine SocketException wegen einer TimeOut und ich verarbeite die Daten nicht, die vom Server kommen.

Gibt es eine Möglichkeit, diese vom Server gesendeten Daten zu verarbeiten?

Nach dem TimeOut warte ich nicht mehr auf die vom Server gesendeten Daten und ich starte den Vorgang erneut, sende neue Daten an den Server, aber wenn ich versuche, das Serverergebnis aus diesen neuen Daten zu lesen, ich Lesen Sie die Serverantwort für die vorherige.

Der Prozess auf dem Client ist kritisch und ich kann nicht warten, um eine Antwort vom Server zu erhalten. Ich muss weiter Daten verarbeiten.

Antwort

0

aber wenn ich versuche, das Serverergebnis von diesen neuen Daten zu lesen, lese ich die Serverantwort für die vorherige.

Ich würde vorschlagen, eine ID zu verwenden, wenn Sie eine Nachricht an den Server senden. (Sie können die ersten 2 Byte Ihres Sendepuffers übernehmen.) Der Server würde diese ID verwenden, wenn er eine Antwort sendet. Jetzt können Sie auf der Client-Seite prüfen, ob Ihre Antwort dieselbe ID hat. Wenn dies der Fall ist, können Sie die Daten verwenden, andernfalls verwerfen Sie sie einfach und versuchen, die nächste eingehende Antwort zu lesen.

Schematisch würde es so aussehen:

  ID = 1 
Client ------------> Server 

      ID = 1 
Client <------------ Server 

      ID = 2 
Client ------------> Server 

X----ERROR----TimeOut 
      ID = 3 

Client ------------> Server 

      ID = 2 
Client <------------ Server 

Client 3!=2 --> do not process, read again 

      ID = 3 
Client <------------ Server 
Verwandte Themen