Sockets in C: accept() mit timeout

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
Benutzeravatar
JoBe
Beiträge: 215
Registriert: 20.06.2003 18:10:01
Wohnort: vorm Rechner
Kontaktdaten:

Sockets in C: accept() mit timeout

Beitrag von JoBe » 26.12.2003 22:38:50

Hi!
Ich habe eine Frag zu den Sockets in C:
Ich habe mittels fork() einen Kindprozess erstellt, der auf Verbindungsanforderungen über nen Socket wartet. Ich möchte aber den Prozess jederzeit beenden können und so hab ich mir ne Variable reingetan, wenn die einen bestimmten Wert hat, soll sich der Kindprozess beenden. Dazu müsste aber accept() nach einer gewissen Zeit auch ohne Verbindungsanforderung zurückkehren. Geht das?
Oder gibts noch Wege, die accept-Funktion abzubrechen?

Olaf Dietsche
Beiträge: 520
Registriert: 12.06.2003 23:18:50
Wohnort: Siegburg

Beitrag von Olaf Dietsche » 27.12.2003 01:00:37

Du kannst mit alarm(2) einen timeout setzen, wenn der Timer abläuft kehrt accept(2) mit EINTR zurück. Bist du sicher, daß du accept(2) und nicht listen(2) meinst?

Benutzeravatar
JoBe
Beiträge: 215
Registriert: 20.06.2003 18:10:01
Wohnort: vorm Rechner
Kontaktdaten:

Beitrag von JoBe » 27.12.2003 10:38:07

Das ist gut, danke!
Ich bräuchte es aber ein bisschen schneller, vielleicht so auf 250ms genau. alarm() schickt doch ein Signal an den Prozess. Bricht accept() auch ab, wenn ich einfach ein beliebiges Signal selbst vom Elternprozess an das Kind schicke?

[EDIT] Ja, ich brauche das für accept, weil ich eine while-Schleife drum mache und so auf Verbindungen warte.

Olaf Dietsche
Beiträge: 520
Registriert: 12.06.2003 23:18:50
Wohnort: Siegburg

Beitrag von Olaf Dietsche » 27.12.2003 12:30:03

Du kannst natürlich im Elternprozess mit usleep(3) schlafen und dann ein Signal an das Kind schicken. Da Linux aber kein Realtime System ist, kannst du nicht sicher sein, daß du exakt 250 ms Verzögerung bekommst.

Normalerweise wartet man mit listen(2) auf neue Verbindungen. Wenn listen ohne Fehler zurückkehrt, wird die Verbindung mit accept(2) akzeptiert.

Benutzeravatar
JoBe
Beiträge: 215
Registriert: 20.06.2003 18:10:01
Wohnort: vorm Rechner
Kontaktdaten:

Beitrag von JoBe » 27.12.2003 13:32:54

Super! Genau das brauch ich. Die Genauigkeit ist egal. Aber eine Sekunde Verzögerung ist einfach zu viel.
In nem Buch von mir (Linux/Unix-Systemprogrammierung) wird so auf Verbindugen gewartet:

Code: Alles auswählen

listen(socket, 5);
while( (connected_socket = accept(...)) >= 0)
{
...
} 
Danke!

Olaf Dietsche
Beiträge: 520
Registriert: 12.06.2003 23:18:50
Wohnort: Siegburg

Beitrag von Olaf Dietsche » 27.12.2003 17:07:01

Das ist korrekt so. Ich hatte das falsch in Erinnerung. Vielleicht kann man etwas mit select machen, aber ich weiß nicht so genau, ob das mit einem listen Socket geht.

Torsten
Beiträge: 384
Registriert: 24.09.2002 22:51:07
Kontaktdaten:

Beitrag von Torsten » 28.12.2003 22:32:53

Moinsen,

na das ist doch eine viel bessere Lösung. Also ein nichtblockierenden socket verwenden meine ich.

Grüße

Torsten

Antworten