Frage

Wenn ich IO gepuffert müssen Dateideskriptor auf die Blockierung ich stdio. Aber wenn ich Dateideskriptor in nicht-blockierenden Modus entsprechend manuelle Stdio Pufferung drehen ist unbrauchbar. Nach einigen Recherchen ich sehe, dass BIO zur Pufferung nicht blockierende IO verwendbar sein kann.

Aber kann es noch andere Alternativen?

Ich brauche diese Verwendung von Threads in einer Multi-Verbindungsumgebung zu vermeiden.

War es hilfreich?

Lösung

Ich denke, was Sie sprechen über die Reactor rel="noreferrer"> verdrillten Matrix .

Der Grund algorith ist:

  • hat einen Puffer für jede Buchse
  • prüfen, welche Buchsen bereit sind, zu lesen (select (), poll () oder iterieren nur)
  • für jeden Sockel:
    • Anruf recv () und den Inhalt in den Puffer mit EWOULDBLOCK
    • bis recv 0 zurück oder ein Fehler der Buchse akkumulieren
    • Anrufanwendungsebene Datenhandler für die Steckdose mit dem Inhalt des Puffers
    • Löschen des Socket-Puffer

Andere Tipps

Ich sehe jetzt die Frage bearbeitet wurde, und ist zumindest verständlicher als bisher.

Wie auch immer, ist das nicht ein Widerspruch?

  • Sie machen I / O nicht blockierend, weil Sie schnell kleine Mengen in der Lage sein zu lesen, in der Regel Durchsatz für Latenz zu opfern.
  • Sie machen es gepuffert, weil Sie nicht so viel kümmern sich um Latenz, wollen aber durch den Handel mit Latenz für Durchsatz effiziente Nutzung des I / O-Subsystem machen.

Doing sie beide zugleich scheint wie ein Widerspruch, und ist schwer vorstellbar.

Was ist die Semantik sind Sie nach? Wenn Sie dies tun:

int     fd;
char    buf[1024];
ssize_t got;

fd = setup_non_blocking_io(...);
got = read(fd, buf, sizeof buf);

Welches Verhalten erwarten Sie, wenn es 3 Byte verfügbar ist? Blocking / gepufferte I / O, bis der Lage blockieren könnten mehr erfüllen Ihre Anfrage, nicht blockierende E / A zurückkehren würde die 3 verfügbaren Bytes sofort.

lesen

Natürlich, wenn Sie einige Protokoll oben haben, legt fest, dass eine Art von Nachrichtenstruktur, so dass Sie wissen, dass „diese I / O unvollständig ist, ich kann es nicht analysieren, bis ich mehr Daten haben“, können Sie puffer es selbst auf diesem Niveau, und die Daten nicht an aufwärts passieren, bis eine vollständige Nachricht empfangen wurde.

Je nach Protokoll, ist es durchaus möglich, dass Sie benötigen, um Puffer liest für einen nicht-blockierenden Netzknoten (Client oder Server).

Typischerweise liefern diese Puffer mehrere Indizes (Offsets), die sowohl die Position des letzten Bytes aufzuzeichnen verarbeitet und letzte Byte gelesen (die entweder gleich oder größer als der Offset-verarbeitet). Und sie auch (soll) bieten reichere Semantik der Verdichtung den Puffers, transparente Puffergröße Management, etc.

In Java (zumindest) das nicht-blockierenden Netzwerk io (NIO) Pakete auch einen Satz von Datenstrukturen bereitzustellen (ByteBuffer, etc.), die auf der Bereitstellung eine allgemeine Datenstruktur ausgerichtet sind.

Es existiert entweder solche Datenstrukturen für C, oder müssen Sie Ihre eigene Rolle. Sobald Sie es haben, dann einfach so viele Daten wie zur Verfügung lesen und lassen Sie die Puffer Ausgaben verwalten wie Überlauf (z Bytes über Nachrichtenrahmengrenzen zu lesen) und die Markierung verwendet versetzte den Bytes zu markieren, die Sie bearbeitet haben.

Wie Android wies darauf hin, werden Sie (sehr wahrscheinlich) müssen angepasst Puffer für jede offene Verbindung erstellen.

Sie können eine Struktur mit Puffer für jede offene Dateideskriptor erstellen, reichern sich dann diese Puffer bis recv () 0 zurück, oder Sie haben Daten genug in Ihrem Puffer zu verarbeiten.

Wenn ich verstehe Ihre Frage richtig, Sie können nicht, weil Puffer mit blockierungs Sie mit mehreren Verbindungen zu dem gleichen Puffer zu schreiben (wenn global) oder einfach nur zu schreiben kleine Stücke von Daten (falls lokal).

In jedem Fall Ihr Programm muss in der Lage sein zu erkennen, wo die Daten kommen (möglicherweise durch Dateideskriptor) aus und puffern sie entsprechend an.

Threading ist auch eine Option, es ist nicht so gefährlich, wie viele es sein klingt aus.

Ryan Dahl eVCOM Bibliothek was genau das tut, was man wollte.

Ich benutze es in meinem Job und es funktioniert super. Beachten Sie aber, dass dies nicht der Fall (noch nicht, aber in Kürze) haben async DNS-Auflösung. Ryan schlägt udns von Michael Tokarev dafür. Ich versuche udns statt Blockierung getaddrinfo () jetzt zu übernehmen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top