Я использую 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";
}
Ваш вызов UDPSocket->waitForBytesWritten();
заставляет ваш цикл ждать, пока сокет не будет сброшен. Либо не вызывайте UDPSocket->waitForBytesWritten();
, или поместите эту процедуру в отдельный поток, поэтому он не будет блокировать.
Цитата документации для waitForBytesWritten()
:
Эта функция может работать без цикла событий. Это полезно при написании приложений без GUI и при выполнении операций ввода-вывода в потоке, отличном от GUI.
vector
? Пожалуйста, скажите мне, что это неvector<char>
. Почему вы не можете просто сказатьsizeof(MsgPacket)
вместо того, чтобы создавать целую переменную для ее определения? Почему вы копируете свое сообщение размером> 1 МБ в вектор пакетов и отправляете их, а не делаете это в режиме нулевой копии? Почему вы кормите пакеты по очереди и ждете?vector
с типомMsgpacket
(структура, которую я определил ранее для представления пакета). ). ЯwriteDatagram()
тип векторных записей кchar
чтобы отправить их с помощьюwriteDatagram()
покажите документацию -.