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()));
    }
}
Другие вопросы по тегам