Отправка пакетов по протоколу UDP

0

Я использую Qt для создания сетевого проекта. Мой проект отправляет файлы в виде пакетов, каждый пакет имеет размер 1 КБ, я использую протокол UDP.

Проблема в том, что когда я пытаюсь отправить файлы с большим размером в мегабайтах, функция writeDatagram() висит, а for loop останавливается (как я чувствую).

Как я могу это решить? Вот код, который я использую для отправки пакетов. Пакеты, хранящиеся в векторе.

for(int i=0;i<vector.size();i++)
{
    char *pkt=(char*)&vector.at(i);
    MsgPacket *p=(MsgPacket*)&vector.at(i);
    UDPSocket->writeDatagram(pkt,sizeof(*p),(*addr),(*port));
    UDPSocket->waitForBytesWritten();
    qDebug()<<"packet"<<i<<"sent";
}
  • 1
    Какой тип vector ? Пожалуйста, скажите мне, что это не vector<char> . Почему вы не можете просто сказать sizeof(MsgPacket) вместо того, чтобы создавать целую переменную для ее определения? Почему вы копируете свое сообщение размером> 1 МБ в вектор пакетов и отправляете их, а не делаете это в режиме нулевой копии? Почему вы кормите пакеты по очереди и ждете?
  • 1
    Я сделал следующее: например, я открываю файл размером 1 МБ, затем делю его на пакеты размером 1 КБ для каждого и сохраняю эти пакеты в vector с типом Msgpacket (структура, которую я определил ранее для представления пакета). ). Я writeDatagram() тип векторных записей к char чтобы отправить их с помощью writeDatagram() покажите документацию -.
Показать ещё 2 комментария
Теги:
qt
udp
qtnetwork

1 ответ

1

Ваш вызов UDPSocket->waitForBytesWritten(); заставляет ваш цикл ждать, пока сокет не будет сброшен. Либо не вызывайте UDPSocket->waitForBytesWritten(); , или поместите эту процедуру в отдельный поток, поэтому он не будет блокировать.

Цитата документации для waitForBytesWritten():

Эта функция может работать без цикла событий. Это полезно при написании приложений без GUI и при выполнении операций ввода-вывода в потоке, отличном от GUI.

  • 0
    Я удалил его, но проблема все еще, и я попытался отправить файл размером 250 k. Если все работает как надо, будет получено 250 пакетов, но в действительности получится 67 пакетов.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню