Russian Qt Forum
Мая 11, 2025, 23:43 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: [РЕШЕНО] Ограничение скорости в QTcpSocket  (Прочитано 5874 раз)
AlekseyK
Гость
« : Ноября 26, 2010, 17:42 »

Как-то пробегала хорошая статья об ограничении скорости в сокете силами Qt. Однако со времён Qt 4.2 поведение QIODevice изменилось и пример перестал работать корректно: кушал 100% CPU (это я исправил), не все данные приходят целиком. Вместо него появился Torrent Example в Qt с ограничением скорости. Мне нужен просто сокет с контролем скорости, поэтому я выкинул из класса PeerWireClient всё, что касается торрента, однако программа не заработала вообще. Кто разбирался с этим моментом: можно вас попросить взглянуть на код, пожалуйста,- в чём причина? Код прилагается. Класс RateController работает отлично - проверено, проблема в изменённом PeerWireClient - у меня это класс KTcpSocket.
« Последнее редактирование: Декабря 02, 2010, 00:07 от AlekseyK » Записан
AlekseyK
Гость
« Ответ #1 : Ноября 27, 2010, 19:05 »

Добавил пару ключевых функций - удалил лишнего, но всё ещё не работает:

Код
C++ (Qt)
void KTcpSocket::connectToHostImplementation(const QString &hostName, quint16 port, OpenMode openMode)
{
   setOpenMode(openMode);
   socket.connectToHost(hostName, port, openMode);
}
 
void KTcpSocket::diconnectFromHostImplementation()
{
   socket.disconnectFromHost();
}

Исправленные исходники добавил.
Записан
AlekseyK
Гость
« Ответ #2 : Ноября 29, 2010, 16:48 »

Кое что понял: в примере Qt были пропущены функции readLine, т.к. в торрент-клиенте они не нужны, добавил в определение класса KTcpSocket (бывший класс PeerWireClient) следующее:
Код
C++ (Qt)
   QByteArray readLine (qint64 maxSize = 0) { return socket.readLine(maxSize); }
   qint64 readLine(char *data, qint64 maxSize) { return socket.readLine(data, maxSize); }
И это естественно и понятно т.к. реально данные пересылаются через QTcpSocket socket, для которого KTcpSocket является вроде прокси. Теперь сокет принимает данные корректно, но не работает ограничение скорости, Подмигивающий потому как сигнал readyRead() сокета завязан на сигнал readyRead() прокси. Блин, замкнутый круг какой-то.  Смеющийся Чего делать??? Улыбающийся
« Последнее редактирование: Ноября 29, 2010, 17:34 от AlekseyK » Записан
AlekseyK
Гость
« Ответ #3 : Декабря 02, 2010, 00:06 »

В общем вопрос решён (не обошлось без помощи автора оригинальной статьи Подмигивающий), пока только для QTcpSocket-a, ssl сокет на подходе, я надеюсь. Кому интересно - пишите. Как будет время отпишусь подробнее тут или может на crossplatform.ru.
Записан
crossly
Гость
« Ответ #4 : Декабря 02, 2010, 00:17 »

пиши.... будет интересно,...
Записан
AlekseyK
Гость
« Ответ #5 : Декабря 02, 2010, 19:57 »

Выложу пока что код, объяснения потом. Для полноценного сокета (если синхронный ввод-вывод нужен) нужно ещё кое-что добавить, но это уже не такая большая проблема. А вот с QSslSocket-ом проблема: не заводится пока зараза, блин: с отправкой данных проблем быть не должно, а вот с получением... Он то размер буфер устанавливает, но похоже не соблюдает: данные все скопом приходят, не середине выскакивает QAbstractSocket::RemoteHostClosedError и данные теряются. Он также сам по себе буферный и данные отправляет в приватный QTcpSocket.
Записан
AlekseyK
Гость
« Ответ #6 : Декабря 02, 2010, 21:20 »

Да уж, там похоже с этим куча проблем:
http://bugreports.qt.nokia.com/browse/QTBUG-15065
http://bugreports.qt.nokia.com/browse/QTBUG-6276
http://bugreports.qt.nokia.com/browse/QTBUG-13431 - по идее в 4.7.2 поправят.
« Последнее редактирование: Декабря 02, 2010, 22:14 от AlekseyK » Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.035 секунд. Запросов: 18.