Russian Qt Forum
Ноябрь 24, 2024, 01:37 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: [РЕШЕНО] Ограничение скорости в QTcpSocket  (Прочитано 5736 раз)
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.829 секунд. Запросов: 20.