[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