linux-l: Ernster Bug: select() geht nicht!

Oliver Hillmann ohil at tequila.in-berlin.de
Fr Okt 22 03:08:42 CEST 1999


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. 

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. 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 Feature dabei ist, daß select() im beschriebenen Fehlerfall sofort
zurückkehrt, wobei recvfrom dann den tatsächlichen Fehler beschreit...

Der Bug ist, daß dieses recvfrom( im Prinzip nur Daten von einen
*einzigen* Host, nämlich dem zunächst angesprochenen, Daten erwaretet... 

Soweit..

Oliver, Dir besonders herzlichen Dank für Deinen Support :)

Gruß

Oli (ebenso)
-- 
Oliver Hillmann, Berlin (Germany) <ohil at tequila.in-berlin.de>



Mehr Informationen über die Mailingliste linux-l