Forum: PC-Programmierung [C] Sockets, select und Threads


von J. K. (jkraemer)


Lesenswert?

Hallo,

derzeit schreibe ich an einer kleinen Netzwerk-Applikation und stehe vor 
einem Problem, das ich bisher nicht lösen konnte:

Ich nutze select((h_socket+1), ...), um auf Nachrichten eines Clients zu 
reagieren. Nachdem select() eine eintreffende Nachricht erkannt hat, 
wird diese mit read() eingelesen.
Bei der weiteren Verarbeitung greift das Programm auf FIFOs zu. 
Geschieht dies, funktioniert das select() anschließend nicht mehr.
Durch den Zugriff auf die FIFOs ändert sich die Anzahl der geöffneten 
Dateideskriptoren (fd) und damit hat select() natürlich ein Problem, 
denn als ersten Parameter erwartet es "fd_max"+1.
Hat jemand eine Idee, wie ich in einem Programm mit mehreren Threads und 
unterschiedlich vielen fds den "fd_max" für das select() herausbekommen 
kann? Oder bin ich vielleicht auf dem Holzweg?

Der fd h_socket ist im Programmverlauf immer gleich (Verbindung wird 
nicht getrennt), aber zwischendurch geschehen beliebig viele Zugriffe 
mit weiteren fds.

Besten Dank! :-)

von Peter II (Gast)


Lesenswert?

J. Krämer schrieb:
> Hat jemand eine Idee, wie ich in einem Programm mit mehreren Threads und
> unterschiedlich vielen fds den "fd_max" für das select() herausbekommen
> kann? Oder bin ich vielleicht auf dem Holzweg?

ich würe statt select poll verwenden, dann gibt es diesen Problem nicht 
mehr.

von docean (Gast)


Lesenswert?

http://www.zotteljedi.de/socket-tipps/index.html

hat mir damals sehr geholfen...

von Rolf Magnus (Gast)


Lesenswert?

J. Krämer schrieb:
> Durch den Zugriff auf die FIFOs ändert sich die Anzahl der geöffneten
> Dateideskriptoren (fd) und damit hat select() natürlich ein Problem,
> denn als ersten Parameter erwartet es "fd_max"+1.

Warum ist das ein Problem?

> Hat jemand eine Idee, wie ich in einem Programm mit mehreren Threads und
> unterschiedlich vielen fds den "fd_max" für das select() herausbekommen
> kann?

Du erstellst doch sowieo direkt vor dem Aufruf dein fd_set, also kennst 
du da doch die Deskriptoren.

von J. K. (jkraemer)


Lesenswert?

Okay, das war auch gar nicht das Problem. Irgendwie war mir klar, dass 
ich den Fehler finde, sobald ich hier nachfrage...
Durch Fehlersuche und Testen hatte ich das fd_set irgendwann an einer 
falschen Stelle deklariert.
Das Problem hat sich damit erledigt. Besten Dank für die Tipps!

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.