6 Stimmen

Aus der Steckdose lesen: Ist garantiert, dass mindestens x Bytes gelesen werden?

Ich habe einen seltenen Fehler, der beim Lesen einer Steckdose aufzutreten scheint.

Es scheint, dass ich beim Lesen von Daten manchmal nur 1-3 Bytes eines Datenpakets erhalte, das größer als dieses ist.

Wie ich aus der Pipe-Programmierung gelernt habe, erhalte ich dort immer mindestens 512 Bytes, solange der Absender genügend Daten bereitstellt.

Außerdem überträgt mein Sender jedes Mal, wenn er etwas sendet, mindestens >= 4 Bytes - ich dachte also, dass am Anfang (!!) der Übertragung mindestens 4 Bytes auf einmal empfangen werden.

In 99,9% aller Fälle scheint meine Annahme zuzutreffen ... aber es gibt wirklich seltene Fälle, in denen weniger als 4 Bytes empfangen werden. Es erscheint mir lächerlich, warum das Netzwerksystem dies tun sollte?

Weiß jemand mehr?

Hier ist der von mir verwendete Lesecode:

mySock, addr = masterSock.accept()
mySock.settimeout(10.0)
result = mySock.recv(BUFSIZE)
# 4 bytes are needed here ...
...
# read remainder of datagram
...

Der Absender sendet das komplette Datagramm mit einem Aufruf von send.

Edit: das Ganze funktioniert auf localhost - es sind also keine komplizierten Netzwerkanwendungen (Router etc.) beteiligt. BUFSIZE ist mindestens 512 und der Absender sendet mindestens 4 Bytes.

0 Stimmen

Darf ich fragen, wie viele Bytes Sie senden und auf welchen Wert BUFIZE eingestellt ist? In den anderen Antworten wird erklärt, dass dies ein völlig normales Verhalten ist und Sie immer in einer Schleife lesen/schreiben sollten, bis Sie genug gelesen haben, aber vielleicht können Sie herausfinden, warum das in diesem Fall auftritt

1 Stimmen

Überprüfen Sie tatsächlich den Rückgabewert von send, um zu überprüfen, wie viele Bytes gesendet werden?

0 Stimmen

Hallo Robert, dieser Vorschlag ist gut. Jetzt weiß ich es. Könnte aber auch Probleme machen ...

1voto

Stobor Punkte 42091

Wenn der Absender 515 Bytes sendet und Ihre BUFSIZE 512 ist, dann wird der erste Recv 512 Bytes zurückgeben, und der nächste 3 Bytes... Könnte das der Fall sein?

(Dies ist nur einer von vielen Fällen, in denen ein 3-Byte-Recv aus einer größeren Sendung resultiert...)

0 Stimmen

Ich wollte nur klarstellen, dass mein Problem gleich zu Beginn einer frisch aufgebauten Verbindung auftritt.

0 Stimmen

+1 als Ausgleich für die unerklärte, ungerechtfertigte Herabstufung, da die Antwort zwar teilweise, aber korrekt ist.

0 Stimmen

@Alex: Nochmal - ich habe mein Problem wirklich sehr detailliert erklärt und die Poster haben es einfach ignoriert. Fühlen Sie sich hier als Sheriff? Ich habe meine Aussagen klar gemacht und wenn ich dann downvote, dann nicht, weil die Antwort unvollständig ist, sondern weil sie (absolut) nicht hilfreich ist und/oder die Frage ignoriert. Ich könnte hier auch einen Vortrag über Musik halten.

1voto

vmf229 Punkte 11

Wenn Sie immer noch interessiert sind, können Sie sich diese Muster ansehen:

# 4 bytes are needed here ......
# read remainder of datagram...

kann die dumme Sache mit dem Fenster verursachen.

Siehe este aus

0voto

Alexander Lubyagin Punkte 1219

Utilice recv_into(...) Methode aus dem socket Modul.

Robert S. Barnes hat das Beispiel in C geschrieben.

Sie können aber Python 2.x mit den Standard-Python-Bibliotheken verwenden:

def readReliably(s,n):
    buf = bytearray(n)
    view = memoryview(buf)
    sz = s.recv_into(view,n)
    return sz,buf

while True:
  sk,skfrom = s.accept()
  sz,buf = io.readReliably(sk,4)
  a = struct.unpack("4B",buf)
  print repr(a)
  ...

Beachten Sie, dass sz zurückgegeben von readReliably() Funktion kann größer sein als n .

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X