Russian Qt Forum

Qt => Работа с сетью => Тема начата: kibsoft от Январь 08, 2011, 20:47



Название: QUdpSocket обрабатывает не все датаграммы..
Отправлено: kibsoft от Январь 08, 2011, 20:47
Посылаю много датаграмм разного размера на "сервер" посредтсвом udp, но не все датаграммы обрабатываются сервером. Проверил сниффером, на комп эти датаграммы доходят, но в программе не обрабатываются. Подумал о размере буфера сокета, но в доке написано:
Цитировать
Only QTcpSocket uses QAbstractSocket's internal buffer; QUdpSocket does not use any buffering at all, but rather relies on the implicit buffering provided by the operating system. Because of this, calling this function on QUdpSocket has no effect.
Сервак на винде.

Обрабатываю так:
Код:
if (!m_receiver.bind(QHostAddress::Any, 45454))
            qApp->quit();

        connect(&m_receiver, SIGNAL(readyRead()),
                this, SLOT(processPendingDatagrams()));
Код:
void Receiver::processPendingDatagrams()
{
    QByteArray datagram;
    QHostAddress address;
    while (m_receiver.hasPendingDatagrams()) {
        datagram.resize(m_receiver.pendingDatagramSize());
        m_receiver.readDatagram(datagram.data(), datagram.size(), &address);
    }
}

Например из 3000 отосланных датаграмм теряется примерно 1000 (Размер пакетов от 200 байт до 1400. Шаг 20 байт. Количество пакетов каждого размера - 50). Что может быть?

P.S. Передаю по локальной сети.


Название: Re: QUdpSocket обрабатывает не все датаграммы..
Отправлено: SimpleSunny от Январь 08, 2011, 21:31
Измените размер средствами ОС.


Название: Re: QUdpSocket обрабатывает не все датаграммы..
Отправлено: kibsoft от Январь 08, 2011, 23:08
В линуксе можно сменить размер буфера, а вот в Windows не нашел как..


Название: Re: QUdpSocket обрабатывает не все датаграммы..
Отправлено: SimpleSunny от Январь 08, 2011, 23:31
Посмотрите в этой теме
http://forum.vingrad.ru/forum/s/721bb06dcede6f7ea372a98f3a7ebb21/topic-261172/anchor-entry1887698/0.html


Название: Re: QUdpSocket обрабатывает не все датаграммы..
Отправлено: kibsoft от Январь 08, 2011, 23:39
Как я понял без winapi не обойтись.. В .NET я знаю, что есть возможность выставить размер буфера сокета. Нельзя ли изменить дефолтный размер где-нибудь в реестре? В Linux же можно поменять данные параметры..


Название: Re: QUdpSocket обрабатывает не все датаграммы..
Отправлено: kibsoft от Январь 09, 2011, 01:57
SimpleSunny, спасибо за идею!

Сделал так:
Код:
int bufferSize = 32*1024;
setsockopt(m_receiver.socketDescriptor(), SOL_SOCKET, SO_RCVBUF, (PCHAR)&bufferSize, sizeof(bufferSize));

Ради любопытства попробовал setReadBufferSize установить..для линукса сработало) хотя в доке написано для udp не имеет эффекта.
Для винды в ifdef'ы обернул код.