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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: QUdpSocket обрабатывает не все датаграммы..  (Прочитано 5400 раз)
kibsoft
Хакер
*****
Offline Offline

Сообщений: 625


Просмотр профиля WWW
« : Январь 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. Передаю по локальной сети.
« Последнее редактирование: Январь 08, 2011, 20:49 от kibsoft » Записан

http://kibsoft.ru - Download the Qt Media Encoding Library here

The apps that were written using QtMEL:
http://srecorder.com - Screen recording software
SimpleSunny
Гость
« Ответ #1 : Январь 08, 2011, 21:31 »

Измените размер средствами ОС.
Записан
kibsoft
Хакер
*****
Offline Offline

Сообщений: 625


Просмотр профиля WWW
« Ответ #2 : Январь 08, 2011, 23:08 »

В линуксе можно сменить размер буфера, а вот в Windows не нашел как..
Записан

http://kibsoft.ru - Download the Qt Media Encoding Library here

The apps that were written using QtMEL:
http://srecorder.com - Screen recording software
SimpleSunny
Гость
« Ответ #3 : Январь 08, 2011, 23:31 »

Посмотрите в этой теме
http://forum.vingrad.ru/forum/s/721bb06dcede6f7ea372a98f3a7ebb21/topic-261172/anchor-entry1887698/0.html
Записан
kibsoft
Хакер
*****
Offline Offline

Сообщений: 625


Просмотр профиля WWW
« Ответ #4 : Январь 08, 2011, 23:39 »

Как я понял без winapi не обойтись.. В .NET я знаю, что есть возможность выставить размер буфера сокета. Нельзя ли изменить дефолтный размер где-нибудь в реестре? В Linux же можно поменять данные параметры..
Записан

http://kibsoft.ru - Download the Qt Media Encoding Library here

The apps that were written using QtMEL:
http://srecorder.com - Screen recording software
kibsoft
Хакер
*****
Offline Offline

Сообщений: 625


Просмотр профиля WWW
« Ответ #5 : Январь 09, 2011, 01:57 »

SimpleSunny, спасибо за идею!

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

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

http://kibsoft.ru - Download the Qt Media Encoding Library here

The apps that were written using QtMEL:
http://srecorder.com - Screen recording software
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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