Russian Qt Forum

Qt => Работа с сетью => Тема начата: AlekseyK от Ноябрь 26, 2010, 17:42



Название: [РЕШЕНО] Ограничение скорости в QTcpSocket
Отправлено: AlekseyK от Ноябрь 26, 2010, 17:42
Как-то пробегала хорошая статья (http://doc.trolltech.com/qq/qq17-ratecontrol.html) об ограничении скорости в сокете силами Qt. Однако со времён Qt 4.2 поведение QIODevice изменилось (http://labs.qt.nokia.com/2006/09/11/behavioral-changes-in-qiodevice-in-qt-42/) и пример перестал работать корректно: кушал 100% CPU (это я исправил), не все данные приходят целиком. Вместо него появился Torrent Example в Qt с ограничением скорости. Мне нужен просто сокет с контролем скорости, поэтому я выкинул из класса PeerWireClient всё, что касается торрента, однако программа не заработала вообще. Кто разбирался с этим моментом: можно вас попросить взглянуть на код, пожалуйста,- в чём причина? Код прилагается. Класс RateController работает отлично - проверено, проблема в изменённом PeerWireClient - у меня это класс KTcpSocket.


Название: Re: Ограничение скорости в QTcpSocket
Отправлено: AlekseyK от Ноябрь 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();
}

Исправленные исходники добавил.


Название: Re: Ограничение скорости в QTcpSocket
Отправлено: AlekseyK от Ноябрь 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() прокси. Блин, замкнутый круг какой-то.  ;D Чего делать??? :)


Название: Re: Ограничение скорости в QTcpSocket
Отправлено: AlekseyK от Декабрь 02, 2010, 00:06
В общем вопрос решён (не обошлось без помощи автора оригинальной статьи ;)), пока только для QTcpSocket-a, ssl сокет на подходе, я надеюсь. Кому интересно - пишите. Как будет время отпишусь подробнее тут или может на crossplatform.ru.


Название: Re: [РЕШЕНО] Ограничение скорости в QTcpSocket
Отправлено: crossly от Декабрь 02, 2010, 00:17
пиши.... будет интересно,...


Название: Re: [РЕШЕНО] Ограничение скорости в QTcpSocket
Отправлено: AlekseyK от Декабрь 02, 2010, 19:57
Выложу пока что код, объяснения потом. Для полноценного сокета (если синхронный ввод-вывод нужен) нужно ещё кое-что добавить, но это уже не такая большая проблема. А вот с QSslSocket-ом проблема: не заводится пока зараза, блин: с отправкой данных проблем быть не должно, а вот с получением... Он то размер буфер устанавливает, но похоже не соблюдает: данные все скопом приходят, не середине выскакивает QAbstractSocket::RemoteHostClosedError и данные теряются. Он также сам по себе буферный и данные отправляет в приватный QTcpSocket.


Название: Re: [РЕШЕНО] Ограничение скорости в QTcpSocket
Отправлено: AlekseyK от Декабрь 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 поправят.