2009-02-27 9 views
5

Linux ha ioctl SIOCOUTQ descritto in man-page tcp (7) che restituisce la quantità di dati non inviati nei buffer socket. Se capisco il codice del kernel, tutti i dati non ACK vengono conteggiati come "non inviati". L'ioctl è disponibile almeno dal 2.4.x.Come ottenere la quantità di dati TCP non ACK-ed per il socket?

C'è qualcosa di simile per {Libero, Rete, Aperto, *} BSD, Solaris, Windows?

+0

Hai mai trovato una soluzione? –

+0

No, TCP_INFO solo per Linux era accettabile per me. – darkk

risposta

0

Poiché il protocollo TCP/IP è implementato come dispositivo di flusso, potrebbe essere possibile eseguire un'immersione del kernel e ottenere la coda-> q_count (numero di byte in coda).

+0

Ovviamente è possibile correggere il kernel e ottenere le informazioni richieste. Mi stavo chiedendo di alcune API esistenti. – darkk

5

Ci sono (almeno) due diverse informazioni che potreste desiderare: la quantità di dati che non è stata ancora inviata e la quantità di dati che è stata inviata ma non modificata.

Su Linux: SIOCOUTQ è documentato per fornire la quantità di dati non inviati, ma in realtà fornisce la somma di (dati non inviati + dati inviati ma non dati ACK). A recent patch (Feb 2016) è stato possibile ottenere i dati non inviati effettivi dal campo tcpi_notsent_bytes nella struttura TCP_INFO.

su MacOS e iOS: getsockopt(fd, SOL_SOCKET, SO_NWRITE, ...) è proprio come SIOCOUTQ: è documentato per dare la quantità di dati inviati, ma in realtà dà la somma di (i dati non inviati + dati inviati-ma-non-ACK-DE). Non conosco alcun modo per ottenere informazioni più dettagliate.

Su Windows: GetPerTcpConnectionEStats con l'opzione TcpConnectionEstatsSendBuff fornisce sia i dati non inviati che i dati inviati ma non l'ACK as two separate numbers.

Non so come ottenere queste informazioni su altri sistemi operativi.