Frage

kann ich wählen (), um festzustellen, ob ein Aufruf recv () blockieren würde, aber sobald ich festgestellt habe, dass ihre ist zu lesenden Bytes, ist sie eine Art und Weise zu Abfrage, wie viele Bytes, bevor ich zur Zeit verfügbar sind eigentlich Aufruf recv ()?

War es hilfreich?

Lösung

Wenn Ihr OS bietet es (und die meisten tun), können Sie ioctl verwenden (.., FIONREAD, ..):

int get_n_readable_bytes(int fd) {
    int n = -1;
    if (ioctl(fd, FIONREAD, &n) < 0) {
        perror("ioctl failed");
        return -1;
    }
    return n;
}

Windows bietet eine analoge ioctlsocket (.., FIONREAD, ..), die lange einen Zeiger auf unsigned erwartet:

unsigned long get_n_readable_bytes(SOCKET sock) {
    unsigned long n = -1;
   if (ioctlsocket(sock, FIONREAD, &n) < 0) {
       /* look in WSAGetLastError() for the error code */
       return 0;
   }
   return n;
}

Der ioctl Aufruf sollte auf Buchsen arbeiten und einige andere fds, wenn auch nicht auf allen fds. Ich glaube, dass es funktioniert gut mit TCP-Sockets auf nahezu jeden freien Unix-ähnliches Betriebssystem Sie wahrscheinlich zu verwenden sind. Seine Semantik ist ein wenig anders für UDP-Sockets: für sie, es Ihnen, die Anzahl von Bytes in dem nächsten Datagramm erzählt.

Der ioctlsocket Aufruf unter Windows wird (natürlich) nur die Arbeit an Steckdosen.

Andere Tipps

Nein, muss ein Protokoll, das bestimmen. Zum Beispiel:

  • Wenn Sie mit fester Größe Nachrichten verwenden, dann wissen Sie, Sie müssen X-Bytes lesen.
  • Sie könnten einen Nachrichten-Header lesen, die angibt, X lesen Bytes.
  • Sie können lesen, bis ein Terminal Zeichen / Sequenz gefunden wird.
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top