Aus Socket lesen

9

Ich muss von einem AF_UNIX-Socket zu einem Puffer mit der Funktion read von C lesen, aber ich kenne die Puffergröße nicht.

Ich denke, der beste Weg besteht darin, N bytes zu lesen, bis der Lesevorgang 0 zurückgibt (keine Schreibmaschinen mehr im Socket). Ist das richtig? Gibt es eine Möglichkeit, die Größe des Puffers zu erraten, der auf den Socket geschrieben wird?

Ich dachte, dass ein Socket eine spezielle Datei ist. Das Öffnen der Datei im Binärmodus und das Abrufen der Größe helfen mir dabei, die richtige Größe für den Puffer zu ermitteln.

Ich bin sehr neu in C, also behalte das im Hinterkopf.

    
Donovan 16.06.2010, 13:41
quelle

5 Antworten

15

Am üblichsten ist es, ioctl(..) zu verwenden, um FIONREAD des Sockets abzufragen, was zurückgibt, wie viele Daten verfügbar sind.

%Vor%     
epatel 16.06.2010, 15:02
quelle
2

Eine Möglichkeit, eine unbekannte Menge aus dem Socket zu lesen, während Blockierung vermieden wird, besteht darin, einen nicht blockierenden Socket für Daten abzufragen ().

z. B.

%Vor%     
Maister 17.06.2010 16:55
quelle
1
  

Ich denke, der beste Weg ist, N zu lesen   Bytes, bis der Lesevorgang 0 zurückgibt (Nr   mehr Autoren in der Steckdose). Ist das   richtig?

0 bedeutet EOF, andere Seite hat die Verbindung geschlossen. Wenn andere Seite der Kommunikation die Verbindung schließt, ist es korrekt.

Wenn die Verbindung nicht geschlossen ist (mehrere Übertragungen über dieselbe Verbindung, gesprächiges Protokoll), dann ist der Fall etwas komplizierter und das Verhalten hängt im Allgemeinen davon ab, ob Sie SOCK_STREAM oder SOCK_DGRAM socket haben.

Datagramm-Sockets sind für Sie bereits vom Betriebssystem getrennt.

Stream-Sockets begrenzen keine Nachrichten (alle Daten sind ein undurchsichtiger Byte-Stream) und falls gewünscht, muss dies auf Anwendungsebene implementiert werden: zum Beispiel durch Definition eines Größenfeldes in der Nachrichtenkopfstruktur oder durch Verwendung eines Trennzeichens (zB \ n 'für einzeilige Textnachrichten). Im ersten Fall würden Sie zuerst den Header lesen, Länge extrahieren und die Länge verwenden, um den Rest der Nachricht zu lesen. In einem anderen Fall lesen Sie den Stream in den Teilpuffer, suchen Sie nach dem Trennzeichen und extrahieren Sie die Nachricht einschließlich des Trennzeichens aus dem Puffer (Sie müssen den Teilpuffer möglicherweise beibehalten, da je nach Protokoll mehrere Befehle mit recv () / read empfangen werden können. )).

  

Gibt es eine Möglichkeit, das zu erraten?   Größe des Puffers, auf den geschrieben wird   die Steckdose?

Für Stream-Sockets gibt es keinen zuverlässigen Weg, da die andere Seite der Kommunikation noch im Prozess des Schreibens der Daten ist. Stellen Sie sich den ganz normalen Fall vor: Socket Buffer ist 32K und 128K wird geschrieben. Die Schreibanwendung würde innerhalb von send () / write () blockieren, wobei das OS auf das Lesen der Anwendung wartet, um die Daten auszulesen und somit Platz für den nächsten Teil der geschriebenen Daten zu schaffen.

Für Datagramm-Sockets kennt man normalerweise die Größe der Nachricht vorher. Oder man kann versuchen (hat das nie selbst getan) recvmsg (MSG_PEEK) und wenn die MSG_TRUNC in der zurückgegebenen msghdr.msg_flags ist, versuchen Sie, die Puffergröße zu erhöhen.

    
Dummy00001 16.06.2010 14:56
quelle
0

Sie haben Recht, wenn Sie die Größe der Eingabe nicht kennen, können Sie jedes Mal nur ein Byte lesen und an einen größeren Puffer anhängen.

    
yurib 16.06.2010 13:48
quelle
0
  

liest N Bytes, bis der Lesevorgang 0 zurückgibt

Ja!

Ein zusätzliches Detail. Wenn der Absender die Verbindung nicht schließt, blockiert der Socket nur, anstatt zurückzukehren. Ein nicht blockierender Socket gibt -1 zurück (mit errno == EAGAIN ), wenn nichts zu lesen ist; das ist ein anderer Fall.

  

Das Öffnen der Datei im Binärmodus und das Abrufen der Größe würden mir helfen, die richtige Größe für den Puffer zu kennen?

Nein. Steckdosen haben keine Größe. Angenommen, Sie haben zwei Nachrichten über dieselbe Verbindung gesendet: Wie lang ist die Datei?

    
Andres Jaan Tack 16.06.2010 14:11
quelle

Tags und Links