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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: QUdpSocket обрабатывает не все датаграммы..  (Прочитано 5533 раз)
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.027 секунд. Запросов: 20.