moin Ich hab mir zu Lernzwecken einen Server geschrieben, bei welchem ein Client eine beliebige Datei anfordern kann und der Server sendet diese dann sofern vorhanden. Hier erstmal der Quelltext des Servers zum Senden der Datei: file = open(f_path, 'rb') while 1: data = file.read(1024) if not data: break self.connection.send(data) Und hier der Quelltext des Clienten zum empfangen: recvBytes = 0 while file_size > recvBytes: data = sockobj.recv(1024) file.write(data) recvBytes += len(data) print file_size, ' - ', recvBytes file_size wird vorher vom Server uebertragen und entspricht natuerlich der Dateigröße Lokal funktioniert das auch, nur wenn Server und Client auf unterschiedlichen Rechnern laufen, bekomm ich vom Clienten folgende Ausgabe: [...] 17684 - 14336 17684 - 15360 17684 - 16384 17684 - 16669 Dann haengt der Client. Wenn ich den Clienten beende, ist die uebertragene Datei genau diese 16669 Bytes groß. Der Server dagegen beendet ganz normal die Uebertragung und wartet auf die naechste Anforderung. Bei anderen Dateien sieht das aehnlich aus, es fehlen anscheinend immer etwas weniger als 1024 Bytes. Vielen Dank fuer eure Hilfe boesi -- Ein Wunder muss heute schon ganz schoen #1671 : icq-intern wundervoll sein um ein Wunder zu sein, #73628288 : icq-extern sonst wuerde man sich ja gar nicht mehr wundern boesi111 : aim .-==Prof. Dr. Harald Lesch==-. i171 : reallife _______________________________________________ python-de maillist - python-de@python.net http://python.net/mailman/listinfo/python-de
Alexander 'boesi' Bösecke wrote: Das Probelm dürfte da stecken:
data = sockobj.recv(1024)
Es wird gewartet, bis 1024 Bytes angekommen sind. Wenn keine mehr kommen, wird halt ewig gewartet. Nachdem Du ja die Filesize kennst, mache folgendes: data = sockobj.recv(min(1024, file_size-recvBytes)) (Kann man sicher optimieren.) Zusätzlich solltest Du einen Timeout einbauen, siehe entsprechende Rezepte, bzw. bei Python 2.3 socket.setdefaulttimeout() -- Regards Hartmut Goebel | Hartmut Goebel | We build the crazy compilers | | h.goebel@crazy-compilers.com | Compiler Manufacturer | _______________________________________________ python-de maillist - python-de@python.net http://python.net/mailman/listinfo/python-de
On Wed, 31 Mar 2004 12:36:27 +0200
Hartmut Goebel
Zusätzlich solltest Du einen Timeout einbauen, siehe entsprechende Rezepte, bzw. bei Python 2.3 socket.setdefaulttimeout() Das ist doch diese Timo-Tasi (das hies doch so,oder?) erweiterung. Die gibts auch für ältere Python Versionen.
grüße, Marek _______________________________________________ python-de maillist - python-de@python.net http://python.net/mailman/listinfo/python-de
Hi Ich antworte mir mal selbst, weil ich ein paar neue Erkenntnisse gewonnen hab :) Also zuerst sei noch erwaehnt, es geht mir um TCP, aber mich interessiert auch, was bei UDP konkret anders implementiert werden muesste. client.py auf dem selben Rechner wie server.py: Client is started - BlockSize: 4096 Datei: d:\treeinfo.wc File will be transfered 30063 - 4096 30063 - 8192 30063 - 12288 30063 - 16384 30063 - 20480 30063 - 24576 30063 - 28672 30063 - 30063 30063 Bytes transfered in 0.01 s client.py auf einem anderen Rechner: Client is started - BlockSize: 4096 Datei: d:\treeinfo.wc File will be transfered 30063 - 2645 30063 - 6741 30063 - 10837 30063 - 14933 30063 - 19029 30063 - 23125 30063 - 27221 30063 - 28612 Offensichtlich kommt die erste Nachricht nicht vollstaendig beim Client ab. Wieviel fehlt, scheint von der konkreten Datei(-Groesse) unabhaengig zu sein. Und genauso sieht dann auch die Datei aus, es fehlen die ersten 1451 Bytes. Nur wo bleiben die haengen? thx & cu boesi -- A Achkatz'l ofm Baam #1671 : icq-intern des hot a schins Laam #73628288 : icq-extern braucht keen Pfenng Gald boesi111 : aim un freit sich of dr Walt i171 : reallife _______________________________________________ python-de maillist - python-de@python.net http://python.net/mailman/listinfo/python-de
Hi Einer der Listen-Admins sollte mal schauen, warum Mails die per CC an die Liste gehen, nicht von der Liste weitergeleitet werden. Oder ist das ein individuelles Problem meinerseits, dass ich derartige Mails nicht bekomme? Oder ist das am Ende Absicht? Am 31.03.2004 11:55:13 schrieb Alexander 'boesi' Bösecke: Also dann antworte ich mir ebend nochmal selbst, Selbststudium kann doch sehr effektiv sein *g*. Ich hab mal die Kommunikation zwischen Client und Server mit Analyzer (ein Sniffer) belauscht. Der Server verwendet folgenden Code zum Senden: self.connection.send('OK') self.connection.send(cPickle.dumps(file_size)) sendBytes = 0 while 1: data = file.read(self.BlockSize) if not data: break self.connection.send(data) sendBytes += len(data) print '%d - %d' % (file_size, sendBytes) Das erste send erzeugt ein eigenes TCP-Packet, so wie's sein soll. Das TCP-Packet des zweiten send dagegen vermischt mit dem des dritten send. Wenn ich nach dem zweiten send ein time.sleep(0.2) einfuege, funktioniert alles wie gewollt. Wer funkt hier dem Server dazwischen und packt (wahllos?) Packete zusammen? Ich kann ja schlecht nach jedem send eine Pause von 200ms (100ms sind zuwenig) einlegen. System ist hier WinXP, aber das soll natuerlich alles plattformunabhaengig funktionieren. thx & cu boesi -- #1671 : icq-intern <THammY-> und meine hände ham bisher immer #73628288 : icq-extern nur das gemacht was ich will </THammY> boesi111 : aim i171 : reallife _______________________________________________ python-de maillist - python-de@python.net http://python.net/mailman/listinfo/python-de
-----BEGIN PGP SIGNED MESSAGE----- Hash: SHA1 Alexander 'boesi' Bösecke wrote: | Wer funkt hier dem Server dazwischen und packt (wahllos?) Packete | zusammen? Ich kann ja schlecht nach jedem send eine Pause von 200ms | (100ms sind zuwenig) einlegen. | System ist hier WinXP, aber das soll natuerlich alles plattformunabhaengig | funktionieren. Schonmal ein flush probiert nach dem send ? In der Regel optimiert der TCP Stack die Packete möglichst optimal, weil jedes Packet einen Overhead erzeugt, wird versucht Packete möglichst nah am MTU zu generieren. Ein Netzwerkprotokoll ist nie so aufgebaut (auser bei UDP). Daß angenommen wird ein Packet enthalte eine gewünschte Information. Jeder Router kann ein Packet splitten wie es ihm beliebt. Ein Protokoll sieht in der Regel etwa so aus: Lenght (integer), Typ (integer), Daten Du ließt die die länge dann ein, und parst die Nachricht nach dem Typ, Gruß ~ Daniel - -- nihil me cirumdat .. . .. ... . . .. . ... . .. . ... . . . pgp key @ http://files.poelzi.org/pgp.txt ED80 E53D 5269 4BB1 1E73 3A53 CBF9 A421 0A7B 003D -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.2.4 (GNU/Linux) Comment: Using GnuPG with Debian - http://enigmail.mozdev.org iD8DBQFAbBHsy/mkIQp7AD0RAre7AJ0cZKNr1kyYfqoJ+Z5lhxxAOGaqQACfQ7Ga spDD4vbnIcl33Ma0sLx/L0Q= =6fo5 -----END PGP SIGNATURE----- _______________________________________________ python-de maillist - python-de@python.net http://python.net/mailman/listinfo/python-de
Hi Am 01.04.2004 14:58:21 schrieb daniel.poelzleithner:
Schonmal ein flush probiert nach dem send ?
hmm laut Doku kennt ein socket kein flush...
In der Regel optimiert der TCP Stack die Packete möglichst optimal, weil jedes Packet einen Overhead erzeugt, wird versucht Packete möglichst nah am MTU zu generieren.
Theoretisch wusste ich das schon, nur mit der praktischen Umsetzung klappte es nicht so recht.
Ein Protokoll sieht in der Regel etwa so aus:
Lenght (integer), Typ (integer), Daten
Danke, das war der entscheidende Hinweise thx & cu boesi, der mal wieder festgestellt hat, dass einem Vorlesungswissen ueberhaupt nicht weiterhilft, wenn man's nicht selbst ausprobiert hat -- Wenn de Lüch net waer un dr Neid #1671 : icq-intern gäbs lauter glückliche Leid #73628288 : icq-extern Uhne Lüch un Neid = ganz gewiß boesi111 : aim wär uf dr Ard is Paradies i171 : reallife _______________________________________________ python-de maillist - python-de@python.net http://python.net/mailman/listinfo/python-de
"Alexander" == Alexander 'boesi' Bösecke
writes:
[...] Alexander> Ich hab mal die Kommunikation zwischen Client und Alexander> Server mit Analyzer (ein Sniffer) belauscht. Alexander> Der Server verwendet folgenden Code zum Senden: Alexander> self.connection.send('OK') Alexander> self.connection.send(cPickle.dumps(file_size)) Alexander> sendBytes = 0 Alexander> while 1: Alexander> data = file.read(self.BlockSize) Alexander> if not data: break Alexander> self.connection.send(data) Alexander> sendBytes += len(data) Alexander> print '%d - %d' % (file_size, sendBytes) Alexander> Das erste send erzeugt ein eigenes TCP-Packet, so wie's Alexander> sein soll. Das TCP-Packet des zweiten send dagegen Alexander> vermischt mit dem des dritten send. Alexander> Wenn ich nach dem zweiten send ein time.sleep(0.2) Alexander> einfuege, funktioniert alles wie gewollt. Alexander> Wer funkt hier dem Server dazwischen und packt Alexander> (wahllos?) Packete zusammen? Ich kann ja schlecht nach Alexander> jedem send eine Pause von 200ms (100ms sind zuwenig) Alexander> einlegen. System ist hier WinXP, aber das soll Alexander> natuerlich alles plattformunabhaengig funktionieren. I glaube nicht, dass Du Dich darauf verlassen kannst, dass die Packetstueckelung, die Du an einem Ende schreibst, am anderen Ende so wieder rauskommt. (IIRC, duerfen Router unterwegs ggf. Pakete aufteilen etc., wenn die so nicht uebertragen werden koennen). TCP ist ein Datenstrohm, da musst Du schon selber im Datenprotokoll fuer eine Datenbegrenzung sorgen. Wg. des 0.2 sek. wartens: Da gibt es eine Option, den Nagle-Algorithmus auszuschalten, damit sollte dieses Zeitinterval kuerzer werden. Aber wie gesagt, verlassen darfst Du Dich da nicht drauf. Holger _______________________________________________ python-de maillist - python-de@python.net http://python.net/mailman/listinfo/python-de
Hi Am 01.04.2004 18:09:45 schrieb Holger Duerer:
Wg. des 0.2 sek. wartens: Da gibt es eine Option, den Nagle-Algorithmus auszuschalten, damit sollte dieses Zeitinterval kuerzer werden.
Das ist dann aber die Methode mit'm Vorschlaghammer, oder? cu boesi -- Ein sicherer Rechner steht ohne Netz und Strom in #1671 : icq-intern einem Schweizer Kellersafe, die Schwiegermutter #73628288 : icq-extern hält mit dem Nudelholz Wache vor der Kellertüre boesi111 : aim ... Und sicher sind die Daten trotzdem nicht ... i171 : reallife _______________________________________________ python-de maillist - python-de@python.net http://python.net/mailman/listinfo/python-de
"Alexander" == Alexander 'boesi' Bösecke
writes:
>> Wg. des 0.2 sek. wartens: Da gibt es eine Option, den >> Nagle-Algorithmus auszuschalten, damit sollte dieses >> Zeitinterval kuerzer werden. Alexander> Das ist dann aber die Methode mit'm Vorschlaghammer, Alexander> oder? Für das, was er machen wollte, schon. Das Abschalten des Nagle-Algorithmus kann jedoch sehr sinnvoll sein. Wenn Du ein Protokoll hast, bei dem beide Seiten schnell, wechselseitig eineinader kurze Packete schicken, bringt das einen merklichen Durchsatzgewinn. Holger _______________________________________________ python-de maillist - python-de@python.net http://python.net/mailman/listinfo/python-de
participants (5)
-
Alexander 'boesi' Bösecke
-
daniel.poelzleithner
-
Hartmut Goebel
-
Holger Duerer
-
Marek Kubica