2009-02-27 3 views
5

Linux hat ioctl SIOCOUTQ in man-page tcp (7) beschrieben, das die Menge nicht gesendeter Daten in Socket-Buffern zurückgibt. Wenn ich den Kernel-Code richtig verstehe, werden alle nicht-bestätigten Daten als "nicht gesendet" gezählt. Das ioctl ist mindestens seit 2.4.x verfügbar.Wie bekomme ich die Menge der nicht-ACK-ed TCP-Daten für den Socket?

Gibt es etwas Ähnliches für {Free, Net, Open, *} BSD, Solaris, Windows?

+0

Haben Sie jemals eine Lösung gefunden? –

+0

Nein, Linux-only TCP_INFO war für mich akzeptabel. – darkk

Antwort

0

Da TCP/IP als Stream-Gerät implementiert ist, könnte es möglich sein, einen Kernel-Tauchgang durchzuführen und die Warteschlange zu erhalten -> q_count (Anzahl der Bytes in der Warteschlange).

+0

Natürlich ist es möglich, Kernel zu patchen und benötigte Informationen zu erhalten. Ich habe mich über eine bestehende API gewundert. – darkk

5

Es gibt (mindestens) zwei verschiedene Informationen, die Sie möglicherweise wünschen: die Menge der Daten, die noch nicht gesendet wurden, und die Menge der Daten, die gesendet, aber nicht bestätigt wurden.

Unter Linux: SIOCOUTQ ist dokumentiert, um die Menge der nicht gesendeten Daten zu geben, aber gibt tatsächlich die Summe von (ungesendeten Daten + send-but-not-ACK-ed Daten). A recent patch (Feb 2016) machte es möglich, die tatsächlichen nicht gesendeten Daten aus dem tcpi_notsent_bytes Feld in der TCP_INFO Struktur zu erhalten.

Auf macOS und iOS: getsockopt(fd, SOL_SOCKET, SO_NWRITE, ...) ist wie SIOCOUTQ: es dokumentiert ist die Menge der noch nicht gesendeten Daten zu geben, aber tatsächlich gibt die Summe von (nicht gesendete Daten + gesendet-but-not-ACK-ed-Daten). Ich kenne keine Möglichkeit, detailliertere Informationen zu erhalten.

Unter Windows: GetPerTcpConnectionEStats mit der Option TcpConnectionEstatsSendBuff erhalten Sie sowohl nicht gesendete Daten als auch Daten, die gesendet, aber nicht bestätigt wurden as two separate numbers.

Ich weiß nicht, wie Sie diese Informationen auf anderen Betriebssystemen erhalten.