【问题标题】:QUdpSocket: Cannot receive datagramQUdpSocket:无法接收数据报
【发布时间】:2012-11-26 05:43:35
【问题描述】:

我正在使用 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;
}

【问题讨论】:

    标签: c++ qt sockets udp sfml


    【解决方案1】:

    我会在绑定之前进行连接。绑定后,readyRead 可能会在连接调用完成之前触发。如果您不清空待处理的数据报,readyRead 将不会再次触发。

    【讨论】:

      【解决方案2】:

      为了将 SIGNAL(readyRead()) 连接到任何插槽,QUdpSocket 必须在 QAbstractSocket::BoundState 中。尽管您在连接之前调用了绑定,但 QUdpSocket 上的绑定会进行非阻塞调用,这意味着绑定可能会延迟。为确保在绑定完成且 QUdpSocket 处于绑定状态后将 SIGNAL(readyRead()) 连接到 SLOT(QtReceive()),请执行以下操作:

      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()));
          }
      }
      

      【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-05-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-01-20
      • 1970-01-01
      相关资源
      最近更新 更多