Как ведет себя QTcpSocket, когда сеть перегружена? - PullRequest
3 голосов
/ 23 сентября 2010

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

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

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

Ответы [ 3 ]

2 голосов
/ 23 сентября 2010

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

1 голос
/ 24 сентября 2010

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

0 голосов
/ 29 января 2012

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...