#qt #udp #qudpsocket
#qt #udp #qudpsocket
Вопрос:
Я видел несколько тем по моему вопросу, но, похоже, я все еще не могу решить проблему, и ответов недостаточно. Итак, вот задача: у меня есть 2 компьютера. Один должен передать 100 udp-пакетов с простыми тестовыми данными, а другой компьютер должен прочитать дейтаграммы. Мой код выглядит следующим образом:
Сервер:
m_socket.udp = новый QUdpSocket(этот);
if (m_socket.udp->bind(QHostAddress("192.168.32.154"), 1234)) {
m_socket.udp->connectToHost(QHostAddress("192.168.32.154"), 1234);
m_socket.udp->waitForConnected();
}
connect(m_socket.udp, SIGNAL(connected()),
this, SLOT(handleConnection()));
connect(m_socket.udp, SIGNAL(readyRead()),
this, SLOT(readyReadUdp()));
Итак … во-первых, происходит сбой привязки к IP-адресу компьютера 1. Я не должен указывать его IP.
Клиент прост:
p_socket = new QUdpSocket(this);
p_socket->connectToHost(QHostAddress("192.168.32.94"), 1234);
connect(p_socket, SIGNAL(connected()), this, SLOT(writeDgram()));
....
void writeDgram() {
p_socket->write(QByteArray("test"));
}
Таким образом, клиентский код, просмотренный в wireshark, поступает на мой серверный компьютер. Но мой серверный Qt-код меня подводит. Здесь есть какая-нибудь помощь?
Комментарии:
1. Не могли бы вы, пожалуйста, быть более конкретными? Что вы видите в wireshark? что вы подразумеваете под «первым сбоем привязки к IP-адресу компьютера 1»?
2. Я привязываюсь к удаленному хосту, например: 192.168.32.150 с портом 1234, это будет машина 1, и с 192.168.32.150 я отправляю 100 дейтаграмм на ожидающий компьютер. Простой пример, который соединяет 2 UDP-сокета, был бы отличным. Но пример должен быть между двумя компьютерами.
3. Так ли сложно обмениваться несколькими дейтаграммами между двумя компьютерами? Пока нет ответов?
4. Вовсе нет. Это должно быть довольно просто.
5. Так почему же эта машина 1 постоянно отправляет UDP, а wireshark перехватывает их с машины 2, но моя привязка никогда не выдает готовые дейтаграммы?
Ответ №1:
Тем не менее, никто не предложил, чтобы я мог быть защищен брандмауэром. В этом и заключалась проблема. Удаление брандмауэра решило эту проблему.
Ответ №2:
Я настроил другой сокет udp для обработки входящих подключений таким образом:
void Server::handleConnection()
{
std::cout << "Connected to host" << std::endl;
m_inaddr = new QUdpSocket(this);
connect(m_inaddr, SIGNAL(readyRead()),
this, SLOT(readyReadUdp()));
QHostAddress addr = m_socket.udp->peerAddress();
quint16 port = m_socket.udp->peerPort();
bool conn = m_inaddr->bind(45678);
if (conn) {
m_inaddr->connectToHost(addr, port);
std::cout << "Bound to: " << addr.toString().toStdString()
<< " port:"
<< port << std::endl;
}
}
Но, похоже, это работает неправильно. Когда я подключен, я могу прочитать одноранговый хост и порт, но вспомогательный сокет, например, inaddress, должен быть привязан к чему? Я запутался с UDP.
[РЕДАКТИРОВАТЬ] Просто чтобы добавить, что я никогда не прерываю работу в слоте readyReadUdp (), я поставил там точку останова. Считыватель стандартный, но слот никогда не вызывается. Так что, я думаю, нет ничего готового для чтения.