2009-02-27 1 views
5

Linux имеет ioctl SIOCOUTQ, описанный в man-странице tcp (7), который возвращает количество неотправленных данных в буферах сокетов. Если я правильно понимаю код ядра, все данные без ACKed считаются «unsent». Ioctl доступен, по крайней мере, с версии 2.4.x.Как получить количество TCP-данных, не ACK-ed для сокета?

Есть ли что-нибудь подобное для {Free, Net, Open, *} BSD, Solaris, Windows?

+0

Вы когда-нибудь находили решение? –

+0

Нет, Linux-only TCP_INFO был для меня приемлемым. – darkk

ответ

0

Поскольку TCP/IP реализован как устройство потока, возможно, потребуется взять погружение с ядра и получить queue-> q_count (количество байтов в очереди).

+0

Конечно, можно исправить ядро ​​и получить необходимую информацию. Мне было интересно узнать о каком-то существующем API. – darkk

5

Существует (по крайней мере) две разные части информации, которые могут вам понадобиться: количество данных, которые еще не были отправлены, и количество данных, которые были отправлены, но не-ACK-ed.

В Linux: SIOCOUTQ документировано, чтобы указать количество неотправленных данных, но на самом деле дает сумму (данные неотправленных данных + отправленные, но не ACK-ed). A recent patch (Feb 2016) позволил получить фактические неотправленные данные из поля tcpi_notsent_bytes в структуре TCP_INFO.

На MacOS и прошивкой: getsockopt(fd, SOL_SOCKET, SO_NWRITE, ...) это так же, как SIOCOUTQ: это документально, чтобы дать количество неотправленных данных, но на самом деле дает сумму (неотправленные данные + данные отправлены, но-не-ACK-е изд). Я не знаю, как получить более мелкую информацию.

В Windows: GetPerTcpConnectionEStats с опцией TcpConnectionEstatsSendBuff вы получаете как неотправленные данные, так и данные отправленного, но не ACK-ed as two separate numbers.

Я не знаю, как получить эту информацию в других операционных системах.