socket.recv Komplette Datenübertragung?

Sockets, TCP/IP, (XML-)RPC und ähnliche Themen gehören in dieses Forum
Antworten
Danic
User
Beiträge: 10
Registriert: Montag 8. Januar 2007, 20:56
Kontaktdaten:

Hallo Leute!

Ich habe ein Problem. Ich sende einen Befehl an einen IL-2 Dedicated Server und möchte die komplette Antwort. Leider funktioniert das nicht so, wie ich will. Die Frage stelle ich weiter unten! :D

Die Ausgabe soll lauten:
? alias ban channel chat console
del difficulty exit extraocclusion f file
help history host kick kick# maxping
mission mp_dotrange param server set show
socket speedbar timeout tod user
So, über Möglichkeit 1 bekomme ich nur die erste Zeile, obwohl ich die Buffergröße auf 10240 gestellt habe?
\u0020? alias ban channel chat console \n

Code: Alles auswählen

#!/usr/bin/python
import sys
from socket import *

SERVER_PORT = 21010
BUFSIZE = 10240

def main():
    host = "62.75.219.146"
    msg = "help\n"

    s = socket(AF_INET, SOCK_STREAM)
    s.connect((host, SERVER_PORT))

    s.send(msg)

    data = s.recv(BUFSIZE)
    print "Daten: %s" % (data)

    s.close()

if __name__ == '__main__':
    main()
Bei Möglichkeit 2 bekomme ich gen ganzen Stream.
\u0020? alias ban channel chat console \n
\u0020del difficulty exit extraocclusion f file \n
\u0020help history host kick kick# maxping \n
\u0020mission mp_dotrange param server set show \n
\u0020socket speedbar timeout tod user \n
<consoleN><86>

Code: Alles auswählen

#!/usr/bin/python
import sys
from socket import *

SERVER_PORT = 21010
BUFSIZE = 1

def main():
    host = "62.75.219.146"
    msg = "help\n"

    s = socket(AF_INET, SOCK_STREAM)
    s.connect((host, SERVER_PORT))

    s.send(msg)

    data = ""
    while True:
        data = s.recv(BUFSIZE)
        sys.stdout.write(data)
        if not data: break

    s.close()

if __name__ == '__main__':
    main()

So, jetzt meine Frage:

Warum bekomme ich bei M1 nicht alles? Ich habe eine Buffergröße, die die Ausgabe aus jeden Fall komplett darstellen sollte. Bei M2 allerdings bekomme ich den ganzen Stream. Warum ist das so?

Und Warum steht da noch \u0020 und \n? Ich habe sogar Zeilenumbrüche, nur eben das wird nicht in einen Zeilenumbruch gewandelt.
BlackJack

Danic hat geschrieben:Warum bekomme ich bei M1 nicht alles? Ich habe eine Buffergröße, die die Ausgabe aus jeden Fall komplett darstellen sollte. Bei M2 allerdings bekomme ich den ganzen Stream. Warum ist das so?
`recv()` liefert soviel wie gerade im Puffer verfügbar ist, aber mindestens 1 Byte. Wenn die Daten grösser sind, als die Paketgrösse oder wenn der Sender zum Beispiel eine Zeile nach der anderen schickt, bekommt man halt nur Teile beim Aufruf der Methode. Bei `M2` liesst Du solange bis die Gegenseite alles gesendet hat und die Verbindung schliesst, nur dann werden bei `recv()` 0 Bytes, also die leere Zeichenkette zurückgegeben.
Und Warum steht da noch \u0020 und \n? Ich habe sogar Zeilenumbrüche, nur eben das wird nicht in einen Zeilenumbruch gewandelt.
Das wird dann so wie es da steht in den empfangenen Daten enthalten sein.
bsimpson888
User
Beiträge: 4
Registriert: Dienstag 23. Juni 2009, 16:05

Hallo,
irgendwas funktioniert nicht mit dem escapen des \n , da hab ich im mom keine antwort drauf.
Allerdings sieht das \u0020 schwer nach einem encoding problem aus. Python wandelt Unicode standart mässig auf diese Weise den String um, wenn das Gegenüber ein anderes Encoding benutzt. Verdacht: Dein Python script hat sein default encoding auf Latin1 ISO-8859-1 und dein Gegenüber auf Unicode stehen.
Entweder du codierst deinen String innerhalb des python scripts vor der Übertragung um, oder Du stellst dein default encoding auf Unicode oder was das andere Programm halt eben benutzt um. Ich glaub der befehl war sys.setdefaultencoding oder os.setdefaultencoding . Abhänging von der python version kanns auch setappdefaultencoding sein. Erinnere mich gerade nicht mehr.
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Das kann schwerlich die Lösung sein, vor allem weil Unicode eben kein Encoding ist.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Antworten