2 Stimmen

Wie kann read() beendet werden, wenn kein EOF gefunden wird?

Ich baue ein Client/Server-Modell auf, verwende aber Sockets, benannte Pipes, mit mkfifo().

Ein Client schreibt die Ausgabe in die Name Pipe, und ich lese die Eingabe in meinem Server mit:

while ((n = read(fd_in, &newChar, 1)) == 1) { /* ... */ }

Ich lese eine Figur nach der anderen, bis ich auf die beiden Figuren treffe: <'CR'><'LF'>. Ich möchte meinen Code so gestalten, dass ich, wenn ein Client nach einiger Zeit nicht mit <'CR'><'LF'> abschließt, ihn verwerfen und mit einem anderen Client fortfahren kann, andernfalls muss der nächste Client vielleicht unendlich lange warten.

Gibt es bitte eine Möglichkeit, die Ausführung von read() zu beenden? Wenn es nicht in 2 Sekunden zurückgekehrt ist, könnte ich sagen, unterbrechen Sie lesen und verwerfen Sie die zuvor gelesenen Zeichen, und beginnen Sie bitte lesen wieder?

Ich danke Ihnen für Ihre Hilfe,

Jary

4voto

user562374 Punkte 3752
#include <stdbool.h>
#include <poll.h>

do {
    ssize_t ret;
    struct pollfd ps = {.fd = fd_in, .events = POLLIN}; 

    if (poll(&ps, 1, 2000) < 0)
        break; /* kick client */
    ret = read(in_fd, ...);
    if (ret != 1)
        break;
    /* process read data */
} while (true);

Dies prüft, ob Daten zu lesen sind; wenn dies nicht innerhalb von 2000 msec der Fall ist, tun Sie, was Sie wollen (z.B. die Verbindung trennen).

3voto

aschepler Punkte 68538

Versuchen Sie, die O_NONBLOCK Flagge, wenn Sie open das Leseende des FIFO. Das sollte das Verhalten so ändern, dass read kehrt sofort zurück, auch wenn die Anzahl der angeforderten Zeichen nicht in der Pipe enthalten ist.

1voto

caf Punkte 224189

Um mehrere Clients gleichzeitig zu bedienen, sollten Sie die Dateideskriptoren nicht-blockierend mit fcntl() und verwenden Sie dann select() o poll() zu blockieren, bis auf mindestens einem von ihnen eine Eingabe erscheint.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X