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;
}
4

2 に答える 2

2

バインドする前に接続します。バインド後、接続呼び出しが完了する前にreadyReadが起動する可能性があります。保留中のデータグラムを空にしないと、readyReadは再度起動されません。

于 2012-12-08T01:51:01.037 に答える
2

SIGNAL(readyRead())を任意のスロットに接続するには、QUdpSocketがQAbstractSocket::BoundStateにある必要があります。接続する前にbindを呼び出しますが、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()));
    }
}
于 2013-11-24T15:48:06.567 に答える