【问题标题】:Qt Network Broadcasting Question: To get sender IPQt网络广播问题:获取发送者IP
【发布时间】:2011-05-03 13:53:15
【问题描述】:

QtSDK中有一个关于网络广播的简单例子。轻松发送和接收广播信息。而在接收端,我想知道我刚刚收到了谁的广播包。我在 readyRead 信号回调函数中尝试 QUdpSocket.peerName(),但我得到空字符串。有什么线索吗?

【问题讨论】:

  • 你找到解决办法了吗

标签: qt networking udp broadcast


【解决方案1】:

您可以在使用QUdpSocket::readDatagram() 读取数据包时检索发件人的IP 地址。您需要向 readDatagram() 传递一个指向 QHostAddress 的指针,用于存储地址:

QHostAddress senderAddress;
yourSocket->readDatagram(&data, size, &senderAddress);
// senderAddress now represents the sender address

如果需要,您可以从 senderAddress 以 QString 或整数形式获取地址,请参阅QHostAddress 的文档。

如果你想要一个主机名,你可以使用QHostInfo 做一个反向查找(但你不能保证得到一个名字)。

【讨论】:

  • socket->readDatagram之后,QString ip = socket->peerAddress().toString();我得到空字符串。
  • @cantinred 已编辑。您需要将指向 QHostAddress 的指针传递给 readDatagram() 以存储地址。
  • @Leiaz 它不起作用。接收广播数据包时,您获得的地址(在 senderAddress 中)为 0.0.0.0。我认为它也可以工作,但是要么 Qt 做了一些愚蠢的事情,要么 Linux 的底层套接字实现为你提供了一个空的源地址来接收广播数据包。
  • @Leiaz 实际上,我收回了……在我的场景中,发件人提供了一个零源地址(它是一个尚未获得地址的 PXE BIOS!)。所以我应该说的是,你不会一定获得源地址,但在典型情况下,你会。
【解决方案2】:

来自文档:

返回由 connectToHost() 指定的对等点的名称,如果尚未调用 connectToHost(),则返回一个空的 QString。

所以,如果您调用了connectToHost(),您应该会得到一个结果。你也可以试试peerAddress()。除非您始终通过名称进行连接,否则我不希望您始终能够进行反向查找并获得名称。

【讨论】:

    猜你喜欢
    • 2013-06-13
    • 2014-08-09
    • 1970-01-01
    • 2018-11-18
    • 2018-03-24
    • 1970-01-01
    • 1970-01-01
    • 2010-10-01
    • 2015-07-31
    相关资源
    最近更新 更多