Mehrere Aufrufe von send () werden zu einem Aufruf von recv () zusammengefasst

8

Ich habe eine Client-Server-Anwendung.

Der Client sendet eine Zeichenfolge gefolgt von einer Ganzzahl mit zwei verschiedenen send() -Aufrufen. Diese beiden Daten sollen in zwei verschiedenen Variablen auf dem Server gespeichert werden.

Das Problem besteht darin, dass beide gesendeten Variablen am Aufruf von recv() empfangen werden. Daher werden die zwei Strings, die von den zwei verschiedenen send() s gesendet werden, verkettet und im Puffer des ersten recv() gespeichert.

Server.c:

%Vor%

client.c:

%Vor%

Wie kann ich es beheben? Was mache ich falsch?

    
geraldCelente 02.07.2014, 16:32
quelle

2 Antworten

7

TCP ist ein Streaming-Protokoll. Es kennt überhaupt keine "Nachrichten" -Grenzen. Es fügt diese Informationen nicht in Abhängigkeit von einzelnen Aufrufen von send() hinzu.

Aufgrund dieser Tatsachen. Eine beliebige Anzahl von send() s auf der Senderseite kann auf der Empfängerseite zu einer beliebigen Anzahl von recv() s (bis zur Anzahl der gesendeten Bytes) führen.

Um dieses Verhalten zu umgehen, definieren und implementieren Sie ein Protokoll auf Anwendungsebene, um die verschiedenen "Nachrichten" zu unterscheiden, die gesendet wurden.

Man kann sich nicht darauf verlassen, dass recv() / send() so viele Bytes empfängt / sendet wie diese beiden Funktionen empfangen / gesendet wurden. Es ist eine wesentliche Notwendigkeit, ihren Rückgabewert zu überprüfen, um zu erfahren, wie viele Bytes diese Funktionen tatsächlich empfangen / gesendet haben und um sie herum zu routen, bis alle Daten, die empfangen / gesendet werden sollen, empfangen / gesendet wurden.

Für Beispiele wie diese "Schleife" gemacht werden könnte

alk 02.07.2014, 16:45
quelle
1

So funktioniert TCP. Behandle es als Byte-Stream. Legen Sie ein grundlegendes Protokoll darauf - begrenzen Sie Ihre Anwendungsnachrichten mit einem bekannten Byte-Wert oder stellen Sie Ihre Nachrichten mit einem Längenfeld voran.

Oder wechseln Sie zu UDP, das Ihnen die gesuchte Datagrammsemantik bietet, wenn Sie gelegentliche Paketverluste tolerieren / wiederherstellen können.

    
Nikolai Fetissov 02.07.2014 16:43
quelle

Tags und Links