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

Oliver Bandel oliver at first.in-berlin.de
Di Okt 19 22:04:07 CEST 1999


Hi!

On Tue, 19 Oct 1999, Oliver Hillmann wrote:

> Hallöchen,
> 
> ich benutze in einem Progrämmchen eine UDP-Socket, die an einen
> lokalen Port gebunden wird und dann an einen anderen UDP-Port Daten
> senden soll. Die Kommunikation auf der Socket läuft
> nicht-blockierend, und nach dem Versenden von Daten warte ich per
> select auf eingehende Daten. Nun das seltsame:
> 
> Wenn am Port, auf den ich Daten sende, jemand lauscht, so geht alles
> wie erwartet. Wenn dort allerdings niemand lauscht, ich also meine
> Pakete ins Nirvana schicke, so kehrt select() nach dem sendto und
> vor dem recvfrom IMMER mit dem Returnwert 1 zurück, und
> FD_ISSET(sock, &fds) liefert immer 1. select sagt also eingehende
> Daten an, obwohl definitiv keine da sind (recvfrom kehrt mit -1
> zurück)

Wieso sollen keine Daten da sein? Weil recvfrom mit -1 zurückkehrt?

Was steht denn in errno? Schon mal nachgeschaut?
Kann es sein, daß dort EWOULD-BLOCK drin steht?

In der recvfrom-Manpage steht nämlich, daß bei einem nicht-blockierenden
Socket dieser Fehler auftreten muß und recvfrom eben -1 zurückliefert.
Das passiert dann, wenn ein receive-Timeout gesetzt ist: Kommen
dann keine Daten und es kommt zum Timeout, dann muß ja ein Fehler
gemeldet werden.
Bei der Solaris-Büchse wird wohl per Default kein Timeout gesetzt
sein und bei Deinen Linuxen schon.

(Na, das war doch ein wirklich freundliches RTFM, oder?)

Tschüß,
   Oliver




Mehr Informationen über die Mailingliste linux-l