1

で問題に直面しましたQUdpSocket。信号readyRead()は決して放出されないようです。そこで、QTimerソケット読み込みキューを作成して状態を確認することにしました。そうすれば、ソケットが適切に機能していること(bytesAvailable()バイト数が表示される)と、シグナル/スロットメカニズムも機能していること(タイムアウト()シグナルが発生したこと)を確認できました。しかし、なぜreadyRead()放出しないのですか?ありがとう。

Qt 5.1

QString EthernetListener::listen()
{
     udp_socket = new QUdpSocket(this);
     connect(udp_socket, SIGNAL(readyRead()), this, SLOT(process_messages()));
     QTimer *timer = new QTimer(this);
     connect(timer, SIGNAL(timeout()), this, SLOT(dummy_slot()));
     timer->start(1000);
     bool res = udp_socket->bind(QHostAddress::Any, 1947, QUdpSocket::ShareAddress);
     if (!res)
         return QString("Не удалось подключиться к хосту").toUtf8();
     return QString("Идет прослушка сети. Хост: ");
}

void EthernetListener::dummy_slot()
{
    int test = udp_socket->bytesAvailable();
}

void EthernetListener::process_messages()
{
     bool bp = true;
}
4

2 に答える 2

2

この問題は、最初のデータグラムの処理中にさらにデータが使用可能になった場合に発生する可能性があります。これをスロットに追加すると、正常に動作するはずです:

int readCount;
while (udpSock->hasPendingDatagrams())
{
    readCount = udpSock->readDatagram(buffer, 4096);
    cout << "readCount = " << readCount << endl;
}
于 2016-02-11T19:35:06.593 に答える
0

これを使用して基本的なレシーバーの実装を試すことができます: Udp Receiver
おそらく、スロットから正しく読み取っていないため、信号が送信されていないように見えます。またはbind、スロットを接続した後で呼び出している場合: おそらく、スロットを接続するbind 前に呼び出す必要があります。

于 2014-03-11T14:21:32.320 に答える