crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

2 страниц V   1 2 >  
Ответить в данную темуНачать новую тему
> Переполнение UDP сокета, Слишком быстрая отправка сообщений
Гость_Михаил_*
сообщение 25.9.2014, 10:36
Сообщение #1





Гости








    


Со стороны клиента при запросе отправляются обработанные данные. Отправка множества пакетов происходит в цикле While очень быстро и очередь отправки забивается.UDP пакеты не попавшие в очередь отбрасываются. Борюсь с этим usleep(), но хотелось бы оптимизировать. Как узнать предел очереди и вызывать usleep() только при переполнении? Пробовал udpSocket->waitForBytesWritten(1) - на каждом сообщении возвращает false. Хотя без usleepa НЕСКОЛЬКО сообщений в сокет залазают.
else if(header.messageType == 4 && header.podtype == 3)
    {

      

        char* bad_buf_rez_mes;
        bad_buf_rez_mes =(char*)malloc( MAX_BAD_MES_REZ_COUNT*sizeof(int) );

        memcpy(bad_buf_rez_mes, in_buf+sizeof(Type_4), size_mes_rez - sizeof(Type_4));


        for(int i=0;   i <  (size_mes_rez - sizeof(Type_4)) / sizeof(int);  i++)
        {
            int temp;
            memcpy(&temp, bad_buf_rez_mes + i * sizeof(int), sizeof(int));
          
            bad_buf_rez_repeat.append(temp);
        }

        




        //Подсчет количества сообщений

        int  N_mes = rezalt_1_ans.ful_size_byf / MAX_MES_SIZE_REZ;

        if(rezalt_1_ans.ful_size_byf % MAX_MES_SIZE_REZ  !=0)
        {
            N_mes += 1;
        }



        QMutableListIterator<int> iter_mes_rez(bad_buf_rez_repeat);
        iter_mes_rez.toFront();


        int cur_len;
        while (iter_mes_rez.hasNext())
        {



            //  прерывание для зашиты от переполнения очереди
           QThread::usleep(100);


            int val = iter_mes_rez.next();

            //подсчет размера отправляемого буфера

            if (val!= N_mes-1)
            {
                cur_len = MAX_MES_SIZE_REZ;
            }
            else
            {
                cur_len = rezalt_1_ans.ful_size_byf - (N_mes - 1)* MAX_MES_SIZE_REZ;
            }



            //выделение памяти под отправляемый буфер
            char* out_buf;
            out_buf =(char* )malloc(sizeof(rezalt_2_ans) + MAX_MES_SIZE_REZ  );
            //подсчет размера отправляемого буфера


            rezalt_2_ans. messageType =4;
            rezalt_2_ans.pod_type = 2;
            rezalt_2_ans.size_buf = cur_len;
            rezalt_2_ans.number_mes = val;



            memcpy(out_buf, &rezalt_2_ans, sizeof(rezalt_2_ans));
            memcpy(out_buf + sizeof(rezalt_2_ans), Zip_Sum_R_re_R_mn_byteArray.data() + val * MAX_MES_SIZE_REZ , cur_len);




            udpSocket->writeDatagram(out_buf, sizeof(rezalt_2_ans) + cur_len,QHostAddress(sProp.host),5825);

       }

}



        }
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
OKTA
  опции профиля:
сообщение 25.9.2014, 11:02
Сообщение #2


Студент
*

Группа: Участник
Сообщений: 29
Регистрация: 4.6.2014
Пользователь №: 4155

Спасибо сказали: 2 раз(а)




Репутация:   0  


Попробуй после writeDatagram поставить udpSocket->flush(). Должно помочь. Но лучше конечно следить за процессом отправки через void QIODevice::bytesWritten ( qint64 bytes ) [signal]. И отправлять новые данные, когда текущие уже ушли.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Гость_Михаил_*
сообщение 25.9.2014, 11:36
Сообщение #3





Гости








    


Пробовал. Не помогает.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Гость_Гость_*
сообщение 25.9.2014, 11:50
Сообщение #4





Гости








    


Цитата(м @ 25.9.2014, 11:02) *
лучше конечно следить за процессом отправки через void QIODevice::bytesWritten ( qint64 байт ) [signal]. И отправлять новые данные, когда текущие уже ушли
можно Поподробней пожалуйста. К какому слоту цеплять?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
OKTA
  опции профиля:
сообщение 25.9.2014, 11:57
Сообщение #5


Студент
*

Группа: Участник
Сообщений: 29
Регистрация: 4.6.2014
Пользователь №: 4155

Спасибо сказали: 2 раз(а)




Репутация:   0  


Делаешь буфер отправки, в котором будут накапливаться пакеты и слот, в котором отправляешь пакеты из этого буфера. Соответственно после первого вызова, новый вызов этого слота должен происходить по приходу сигнала, что предыдущие пакеты отправлены. Примерно так можно реализовать.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Гость_Михаил_*
сообщение 25.9.2014, 12:01
Сообщение #6





Гости








    


Пробовал так
// если(udpSocket->flush()==false) // { // QThread::usleep(100); // }
и так
 // если(udpSocket->waitForBytesWritten(1)==false) // { // QThread::usleep(100); // }
Результат одинаковый. При каждой отправке выдает false. Хотя очередь забита не до конца.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Гость_Михаил_*
сообщение 25.9.2014, 12:03
Сообщение #7





Гости








    


Спасибо. Попробую.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
OKTA
  опции профиля:
сообщение 25.9.2014, 12:07
Сообщение #8


Студент
*

Группа: Участник
Сообщений: 29
Регистрация: 4.6.2014
Пользователь №: 4155

Спасибо сказали: 2 раз(а)




Репутация:   0  


Не, подход с usleep в корне неверный, это не кашерно 8)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Гость_Михаил_*
сообщение 25.9.2014, 12:12
Сообщение #9





Гости








    


Цитата(м @ 25.9.2014, 12:07) *
Не, подход с usleep в корне неверный, это не кашерно 8)

Ваши конструктивные предложения :rolleyes:
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
OKTA
  опции профиля:
сообщение 25.9.2014, 12:15
Сообщение #10


Студент
*

Группа: Участник
Сообщений: 29
Регистрация: 4.6.2014
Пользователь №: 4155

Спасибо сказали: 2 раз(а)




Репутация:   0  


Я озвучил уже) отслеживать непосредственную отправку пакетов и только потом спамить новыми ;)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

2 страниц V   1 2 >
Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 29.3.2024, 9:31