1

私の質問に関するスレッドはほとんど見たことがありませんが、それでも問題を解決できないようで、返信も十分ではありません。タスクは次のとおりです。私は 2 台の PC を持っています。1 台は単純なテスト データを含む 100 個の udp パケットを送信する必要があり、もう 1 台のマシンはデータグラムを読み取る必要があります。私のコードは次のとおりです。

サーバー:

m_socket.udp = 新しい QUdpSocket(これ);

if (m_socket.udp->bind(QHostAddress("192.168.32.154"), 1234)) {
    m_socket.udp->connectToHost(QHostAddress("192.168.32.154"), 1234);
    m_socket.udp->waitForConnected();
}
connect(m_socket.udp, SIGNAL(connected()),
        this, SLOT(handleConnection()));
connect(m_socket.udp, SIGNAL(readyRead()),
        this, SLOT(readyReadUdp()));

つまり... まず、マシン 1 の IP へのバインドが失敗します。その IP を指定してはなりません。

クライアントは単純です:

p_socket = new QUdpSocket(this);
p_socket->connectToHost(QHostAddress("192.168.32.94"), 1234);
connect(p_socket, SIGNAL(connected()), this, SLOT(writeDgram()));
....
void writeDgram() {
    p_socket->write(QByteArray("test"));
}

したがって、Wireshark で表示されるクライアント コードは、私のサーバー マシンに送られます。しかし、私のサーバーQtコードは私を失敗させます。ここで何か助けはありますか?

4

2 に答える 2

1

それでも、私がファイアウォールで保護できるとは誰も提案しませんでした。それが問題でした。ファイアウォールを削除すると、これが解決しました。

于 2016-10-28T10:22:10.197 に答える
0

着信接続をそのように処理するために別のudpソケットをセットアップしました:

    void Server::handleConnection()
{
    std::cout << "Connected to host" << std::endl;
    m_inaddr = new QUdpSocket(this);
    connect(m_inaddr, SIGNAL(readyRead()),
            this, SLOT(readyReadUdp()));

    QHostAddress addr = m_socket.udp->peerAddress();
    quint16 port = m_socket.udp->peerPort();

    bool conn = m_inaddr->bind(45678);

    if (conn) {
        m_inaddr->connectToHost(addr, port);
        std::cout << "Bound to: " << addr.toString().toStdString()
                  << " port:"
                  << port << std::endl;
    }

}

しかし、それは適切な方法で機能していないようです。接続すると、ピアホストとポートを読み取ることができますが、inaddress の補助ソケットは何にバインドする必要がありますか? UDPと混同しています。[編集] readyReadUdp() スロットでブレークしないことを付け加えるために、そこにブレークポイントを置きました。リーダーは標準的なものですが、スロットは呼び出されません。だから、読む準備ができているものは何もないと思います。

于 2016-10-24T14:04:05.727 に答える