QUdpSocket: невозможно получить дейтаграмму
Я использую QUdpSocket для получения данных с сервера. Когда я получаю данные с помощью SFML, я могу получать данные через SocketUdp, но с помощью qt это не работает.
void TheClass::Bind()
{
m_sock_receive = new QUdpSocket(this);
if (m_sock_receive->bind(QHostAddress::Any, port))
{
std::cout << "Bind: OK" << std::endl;
connect(m_sock_receive, SIGNAL(readyRead()), this, SLOT(QtReceive()));
}
else
std::cout << "Bind: NOK" << std::endl;
}
void TheClass::QtReceive()
{
std::cout << "Pending data !" << std::endl;
}
2 ответа
Я бы сделал соединение до того, как связать. Вполне возможно, что после привязки readyRead срабатывает до завершения вызова подключения. Если вы не очистите ожидающие дейтаграммы, readyRead не сработает снова.
Чтобы подключить SIGNAL(readyRead()) к любому слоту, QUdpSocket должен быть в QAbstractSocket::BoundState. Хотя вы вызываете связывание перед соединением, связывание в QUdpSocket делает неблокирующий вызов, то есть связывание может быть отложено. Чтобы убедиться, что вы подключили SIGNAL(readyRead()) к SLOT(QtReceive()) после завершения привязки и того, что QUdpSocket находится в связанном состоянии, выполните следующие действия:
void TheClass::Bind()
{
m_sock_receive = new QUdpSocket(this);
connect(m_sock_receive, SIGNAL(stateChanged(QAbstractSocket::SocketState)),
this, SLOT(onSocketStateChange(QAbstractSocket::SocketState)));
if (m_sock_receive->bind(QHostAddress::Any, port))
{
std::cout << "Bind: OK" << std::endl;
}
else
std::cout << "Bind: NOK" << std::endl;
}
void TheClass::QtReceive()
{
std::cout << "Pending data !" << std::endl;
}
void TheClass::onSocketStateChange (QAbstractSocket::SocketState state) {
if ( state == QAbstractSocket::BoundState ) {
connect(m_sock_receive, SIGNAL(readyRead()), this, SLOT(QtReceive()));
}
}