QUdpSocket: 无法接收数据报

3

我正在使用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个回答

2
为了将SIGNAL(readyRead())连接到任何一个slot,QUdpSocket 必须处于 QAbstractSocket::BoundState 状态。即使在调用 connect 之前已经调用了 bind 函数,但是在 QUdpSocket 上调用 bind 函数是一个非阻塞的操作,意味着绑定可能会被延迟。为了确保在绑定完成并且 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()));
    }
}

阅读QT 4.8.6源代码,我发现如果bind()函数成功,BoundState会立即设置。请自行查看:https://github.com/qt/qt/blob/4.8/src/network/socket/qudpsocket.cpp#L265 - Fabio A.

2

我会在绑定之前建立连接。有可能在绑定后,readyRead事件在连接完成之前触发。如果您不清空待处理的数据报,readyRead事件将不会再次触发。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接