[Python-de] Dateien ueber Sockets uebertragen
Ulrich Berning
ulrich.berning at t-online.de
Don Apr 8 02:21:37 CEST 2004
Alexander 'boesi' Bösecke schrieb:
>Hi
>
>Am 06.04.2004 21:48:32 schrieb Holger Duerer:
>
>
>
>>Hmmm. Rein aus dem Gedächnis heraus, würde ich sagen, daß man besser
>>self.sendall(sendData) sagen sollte. Falls sendData zu gross wird,
>>wird Dir send() nicht alles schicken.
>>
>>
>
>Hab mir mal die Doku dazu angesehen.
>send und sendall unterscheiden sich lediglich in der Fehlerbehandlung.
>send gibt die Zahl der gesendeten Bytes zurueck, im Normalfall ist das
>halt len(sendData). sendall dagegen loest eine exception aus, wenn nicht
>alle Bytes gesendet werden konnten, es ist aber nicht moeglich zu
>erfahren wieviele Bytes gesendet worden.
>Es ist also Blödsinn send in try-except zu kapseln, und da ich ich im
>Moment noch keine Fehlerbehandlung einbauen will, kann/sollte ich
>sendall verwenden, damit ich Fehler ueberhaupt mitbekomm.
>
>cu boesi
>
>
Auf die Gefahr hin, als Spielverderber angesehen zu werden, aber meine
Mail ist jetzt die 20. Mail zu einem relativ einfachen Problem.
Generell scheint hier ein Missverständnis über send() vorzuliegen. Es
ist weder ein Fehler, wenn send() nicht alle Daten versenden kann, noch
kann es als Normalfall angesehen werden, dass send() alle Daten auf
einmal sendet. Im Extremfall könnten die Daten bytesweise versendet und
empfangen werden.
Eine Funktion zum Versenden von Daten sollte immer den Rückgabewert von
send() berücksichtigen, und send() solange aufrufen, bis alle Daten
versendet wurden. Das gleiche gilt natürlich für das Empfangen von
Daten. Aufrufe von time.sleep() oder sonstige zeitintensive Aktivitäten
haben in den Sende-/Empfangs-Funktionen nichts zu suchen, es sein denn,
die Performance ist einem völlig egal.
Solche Massnahmen wie Abschalten des Nagle-Algorithmus verbieten sich
völlig, da Sie Einfluss auf die gesamte Netzwerkperformance haben können.
Ulli