#c #qt #sockets #qtnetwork #qudpsocket
#c #qt #сокеты #qtnetwork #qudpsocket
Вопрос:
Я пытаюсь установить связь между клиентами через UDP. Я использую QUdpSocket
для этого.
IP-адрес моего первого клиента — 127.0.0.2, а IP-адрес второго клиента — 127.0.0.3.
В моем первом клиенте я хочу отправлять данные, поэтому я делаю это:
socket = new QUdpSocket(this);
socket->bind(QHostAddress("127.0.0.2"), (quint16)actual_port);
...
Data = QByteArray::fromRawData((const char *)stockR.data, crypt_packet.size_struct);
socket->writeDatagram(Data, QHostAddress("127.0.0.3"), (quint16)port_other);
В моем втором клиенте у меня есть это:
socket = new QUdpSocket(this);
socket->bind(QHostAddress("127.0.0.3"), (quint16)port_second);
...
QByteArray buffer;
buffer.resize(socket->pendingDatagramSize());
QHostAddress sender;
quint16 senderPort;
socket->readDatagram(buffer.data(), buffer.size(), amp;sender, amp;senderPort);
Но я не могу получать свои данные с readDatagram()
, и я не знаю почему.
Я выполняю каждую функцию с обеих сторон, что означает, что я читаю и пишу на обоих клиентах (это для выполнения VoIP-вызова).
Кто-нибудь знает, в чем моя ошибка?
Комментарии:
1. Как вызывается этот последний блок? Это в ответ на
readyRead
сигнал? Этоsocket->hasPendingDatagrams()
правда?2. Я не использую socket-> hasPendingDatagrams и readyRead.
Ответ №1:
readDatagram
Метод неблокирующий: вы можете использовать его только в том случае, если hasPendingDatagrams()
значение true . Этот флаг, в свою очередь, регулируется выполнением цикла событий Qt.
У вас есть два варианта:
- Используется
socket->waitForReadyRead()
для блокировки вашей программы на установленное время (30 секунд); - Или поместите приведенный выше код в обработчик слота, подключенный к
readyRead
сигналу, и позвольте циклу событий выполняться естественным образом, сохраняя чувствительность вашего приложения к другим входным данным.