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