2010-09-23 5 views
3

У меня есть QTcpSocket в отдельном потоке, отправляющем много данных. Некоторые из этих приложений распространяются по сети.Что такое поведение QTcpSocket при перегрузке сети?

Как определить, перегружена ли моя сеть, и мой сокет больше не может отправлять что-либо? Будет ли QTcpSocket буферизовать все данные, как я могу увидеть размер моих буферизованных данных, которые будут отправлены в очередь? Будет ли это равно bytesToWrite()? Есть ли максимальный bytesToWrite()?

Если QTcpSocket начинает отбрасывать данные, какие данные будут: старейшие в очереди буфера, самые новые в очереди буфера, ...?

ответ

2

По-видимому, это не так, я просто проверил код для Qt 4.5.3. При вызове write() все данные помещаются в QRingBuffer (класс не входит в Qt API). QAbstractData :: writeData() помещает данные в, QAbstractData :: flush() вытаскивает его. Не существует проверки, которая ограничивает размер этого буфера. Размер, возвращаемый QAbstractSocket :: write(), всегда равен размеру ваших данных или -1 при ошибке.

1

QTcpSocket буферизует все, что вы пишете в него, и попытается написать как можно больше при следующем запуске цикла событий. Вы должны выполнить свое собственное «управление потоком», проверив socket-> bytesToWrite(), который сообщает вам, сколько еще находится в буфере Qt (+ будут добавлены дополнительные данные в вашем буфере ОС, который вы не контролируете)

0

Вы должны проверить bytesToWrite(), вы себя и отбросить все старые/новые данные, если она достигает максимума:

if (bytesToWrite() > 16 * 1024 * 1024) { 
    // discard data 
} else { 
    write(moredata); 
} 

bytesToWrite() является показателем того, насколько быстро он может отправить. Вы можете проверить это значение и дросселировать datarate, чтобы bytesToWrite() всегда возвращался примерно того же размера.

Смежные вопросы