Schrift
[thread]6771[/thread]

Ungepfuffertes schreiben in/auf Socket



<< >> 3 Einträge, 1 Seite
roli
 2005-03-09 11:54
#52459 #52459
User since
2004-12-31
424 Artikel
BenutzerIn
[default_avatar]
Hi,

ich bin gerade dabei eine kleine Client Server Anwendung zu schreiben, die ueber Sockets komuniziert.
Da ich auf dem Server einige "Langlaeufer" Job's starten moechte, wollte ich in der Zeit in der der Job laeuft dem Client eine "Fortschritsanzeige" spendieren, die einfach daraus besteht, das jede Sekunde ein Punkt geschrieben wird. Jedenfalls moechte ich so den Eindruck vermeiden das die Anwendung "eingefroren" ist.
Auf Permonks habe ich folgendes gefunden:
Code: (dl )
Perl does not support truly unbuffered output (except insofar as you can syswrite(OUT, $char, 1)).

leider funktioniert das nicht so wie ich's mir gedacht habe. Die Punkte werden erst an den Client uebertragen wenn der Job fertig ist (wenn ich den newline sende). Weiter unten auf dieser Web Seite ist ein Beispiel fuer Sockets, hier wird jedoch wieder print anstelle von syswrite verwendet, ausserdem wird hier wieder expliziet ein Newline an den String angehaengt, was ich eben vermeiden moechte, wenn's denn ueberhaupt moeglich ist? Hier mein Code.
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
$|=1; # $OUTPUT_AUTOFLUSH, 0 Puffert einige Zeichen, !=0 schreibt direkt
 $sock->autoflush();
  my $kid;
 
 # Quelle: http://www.unix.org.ua/orelly/perl/cookbook/ch16_10.htm
 my $pid = open3(*HIS_IN, *HIS_OUT, *HIS_ERR, $job) or die  "Fehler in open3 $!\n";
 print $sock "Warte das der Prozess $job mit $pid beendet wird\n";
 do {
   sleep(1);
   #print $sock ".";
   syswrite($sock, ".", 1);
   $kid = waitpid($pid, WNOHANG);
  } until $kid != 0;
 print $sock "\n";

Ich verstehe "unbuffered output" halt nicht so, das ich nach jedem Zeichen ein newline senden muss. Habe ich die Doku hier falsch verstanden, und es geht doch nicht, oder mache ich einen Fehler?
Roland
--
"Steh vorn, während du fragst;
sitzen soll, wer antwortet."
Aus "Die Edda des Snorri Sturluson" "Gylfis Täuschung" Strophe 2
snarf
 2005-03-09 12:17
#52460 #52460
User since
2003-08-14
77 Artikel
BenutzerIn
[default_avatar]
Hallo,

... ohne jetzt direkt eine Antwort auf Deine Frage parat zu haben: Warum machst Du Dir mit dem Newline ein Problem?

Dein Punkt muss doch sowieso vom Socket gelesen werden und dann auf dem Screen ausgegeben werden - da sollte es doch keine Problem sein, ein chomp einzuschieben, oder?

Wenn das natürliche eine ganz grundsätzliche Diskussion ist, die Du damit anstossen möchtest, dann vergiss diesen Beitrag einfach, ok?

ReadU, snarf
roli
 2005-03-09 12:46
#52461 #52461
User since
2004-12-31
424 Artikel
BenutzerIn
[default_avatar]
Hi Snarf,

erst mal Danke. Zum einen wuerde ich (grundsaetzlich) wirklich erstmal verstehen wollen "warum es ist wie es ist", bzw. wo der Fehler/das Missverstaendnis liegt.
Zum andern, klar, koennte ich mittels chomp das Newline auf dem Client "entsorgen", aber nach meinem (derzeitigen) Ansatz (vielleicht sollte ich den halt mal ueberdenken) haette ich die Newlines die vom Server kommen gerne.
Roland
--
"Steh vorn, während du fragst;
sitzen soll, wer antwortet."
Aus "Die Edda des Snorri Sturluson" "Gylfis Täuschung" Strophe 2
<< >> 3 Einträge, 1 Seite



View all threads created 2005-03-09 11:54.