2017-06-28 3 views
0

Ich habe ein Client-Server-Programm. Sie kommunizieren mit einigen Charakteren.TCP/IP: Nachricht von recv() in Reihenfolge ohne Puffer erhalten

ex: 
client --send A-> server 
then 
client <-recv A'-- server 

Aber ich lasse Nachrichtenserver schicken zurück nicht in Ordnung.

ex: 
client --A--> --B--> --C--> server 
then 
client <--A'-- <--C'-- <--B'-- server 
what I want: 
client <--A'-- <--B'-- <--C'-- server 

so möchte ich die Situation in Client-Programm behandeln.

Ich finde nur einen Weg ist halten Sie einen Puffer, um Daten vom Server aufzuzeichnen, und Client wird überprüfen, die B empfangen und dann überprüfen Sie das C in der Reihenfolge erhalten.

Gibt es das im Client sowieso, und vermeiden Sie die Verwendung von Puffer?

+1

Dies ist nur möglich, wenn Sie einen Fehler in Ihrem Code haben. TCP behält die Reihenfolge der gesendeten Bytes bei. – EJP

+0

@EJP nicht Bug, ich entwerfe den Server, um Zeichen zurück zu senden nicht in der Reihenfolge – yayaya

+0

Wirklich. Eine Frage. Warum? Warum an einem Ende einen absichtlichen Fehler einbauen, den man am anderen Ende nicht lösen kann? – EJP

Antwort

0

Idealerweise sollten Sie senden und dann auf die Antwort warten, senden Sie die nächste Anfrage, wenn Sie eine frühere Antwort erhalten haben. Aber scheinbar scheint Ihr Client zu senden, ohne auf Antwort und Serverantworten zu warten, egal welche Anfrage die Verarbeitung erledigt hat.

In diesem Fall müssen Sie einen Mechanismus in Ihrem Client- und Serverprogramm basierend auf den gesendeten und empfangenen Daten einrichten.

Sie können Ihren Client entscheiden und Server arbeiten auf Daten mit (Header + Daten) Format so etwas wie:

length(2 bytes) - length of actual data 
sequence numner(2 bytes) - to be incremented for each request 
Actual data(length number of bytes) 

Wenn Sie die Daten senden und die Anforderungsdaten halten, nachdem Buchse Senden über, in einem anhängigen Liste der Anfragen, die auf eine Antwort vom Server warten. Der Server nach dem Empfang der Anfrage im obigen Format, aktualisiert seine Antwortdaten im Abschnitt 'Tatsächliche Daten', aktualisiert die Länge im Header, wobei die Reihenfolge beibehalten wird, der Server sendet eine Antwort an den Client. Der Client wird die Sequenznummer aus der Antwort mit den Elementen in seiner ausstehenden Liste abgleichen, um die Anfrage zu erhalten, deren Antwort er vom Server erhalten hat

+0

Warum? Wie können die Daten jemals aus der Reihenfolge geraten? – EJP

+0

Ich sage nicht, dass Daten aus der Reihe geraten, es ist für die Situation, wenn Server Request-Daten A empfängt und dann B, entscheidet B zu antworten und dann A, ich weiß TCP hat Mechanismus zum Senden von Daten in Folge, dh Wenn Anforderungsdaten A mehrere Bytes haben, dann werden sie in der gleichen Reihenfolge ankommen, in der sie gesendet wurden – Pras

+0

@Pras TCP behält die Reihenfolge bei. Aber ich lasse Server Zeichen zurück zum Klienten schicken, der nicht in Ordnung ist. Vielleicht muss ich die Gültigkeit des Inhalts im Client überprüfen. Ich will nur irgendeine Funktion wissen, oder api kann damit umgehen. thx – yayaya