linux-l: Ernster Bug: select() geht nicht!
Oliver Bandel
oliver at first.in-berlin.de
Sa Okt 23 11:48:14 CEST 1999
Hi!
On Fri, 22 Oct 1999, Oliver Hillmann wrote:
> On Thu, 21 Oct 1999, Oliver Bandel wrote:
>
> > Hi!
>
> Ho!
>
> > > On Tue, 19 Oct 1999, Oliver Bandel wrote:
> > >
> > > > > [..]
> > > > Wieso sollen keine Daten da sein? Weil recvfrom mit -1 zurückkehrt?
> > >
> > In Deinem Beispiel-Programm werden die Rückgabewerte nicht abgefragt.
> > Also wirdst Du auch nur mutmaßen können, wo's hakt.
> > [..]
>
> Okay... Nicht faul, hab ich natürlich weiter gesucht und probiert, und ich
> denke, ich hab die Lösung - falls es jemanden interessiert, sei sie nun
> präsentiert:
>
> Zur Erinnerung: Ich sandte ein UDP-Packet über eine Socket an einen Host,
> der nicht lauschte, und wenn ich nun versuchte, von selbiger Socket
> eingehende UDP-Packets zu lesen, kehrte trotz nicht vorhandener Daten
> select() > 0 zurück (will sagen: "Es ligen Daten an.") und recvfrom kehrte
> mit -1 und errno == ECONNREFUSED zurück.
Das ECONNREFUSED wundert mich; in meiner Manpage steht das nicht mal
in der Fehlerliste (es gibt hier nur einb ENOTCONN).
Welche Infos gibt denn das ICMP-Paket her?
>
> Der Grund: Wenn erstes sendto fehlschlägt, weil der Zielhost nicht
> lauscht, so sendet dieser Zielhost ein ICMP-Paket (Not reachable oder
> so...) zurück, was dem Absendehost sagt, daß da gar keiner lauscht.
Naja, würde er nicht lauschen, gäbe er auch keine ICMP-Message
aus.
Der andere Server lauscht schon, aber er will die Pakete nicht annehmen.
> Mein
> Programm (bzw. die kernelseitige Implementierung) nimmt nun an, daß von
> dort natürlich auch nix kommen kann, denn der Host ist - zumindest was
> diesen Port angeht - down, und daher ein "Connection refused"-Error von
> recvfrom, und evtl. auch der select()-Fehler.
Das ist aber nicht ein BUG von select. :-)
>
> Das Feature dabei ist, daß select() im beschriebenen Fehlerfall sofort
> zurückkehrt, wobei recvfrom dann den tatsächlichen Fehler beschreit...
Hmhhh. Irgendwie muß man doch die Infos des ICMP-Paketes lesen können.
Eigentlich soll ja recvfrom auch nutzbar sein?
Vielleicht mal etwas an den sockaddr-Flags drehen, damit Du auch
das ICMP-Zeugs einlesen kannst.
Oder schreib noch einen Extra-Teil für die Fehlerbehandlung.
(select() wird ja eigentlich auch zum Multiplexen genutzt, um
halt mehrere Verbindungen zu handeln...).
>
> Der Bug ist, daß dieses recvfrom( im Prinzip nur Daten von einen
> *einzigen* Host, nämlich dem zunächst angesprochenen, Daten erwaretet...
? Von dem wird die Message doch auch kommen...
>
> Soweit..
..so gut. :-)
Tschüß,
Oliver
Mehr Informationen über die Mailingliste linux-l