【问题标题】:Using QUdpSocket to send datagrams使用 QUdpSocket 发送数据报
【发布时间】:2011-08-03 19:42:49
【问题描述】:

我正在尝试使用 QUdpSocket 发送数据报。以下是我正在使用的代码:

udpSocket = new QUdpSocket(this);
QByteArray datagram = "Message";
udpSocket->writeDatagram(datagram.data(), datagram.size(), QHostAddress::Broadcast, 45454);

现在,如果我在只有一个网络适配器的计算机上运行它,它似乎可以正常工作。但是,如果有多个适配器,我需要能够控制哪个用于发送数据报。我发现如果我按如下方式绑定套接字:

udpSocket->bind(QHostAddress("192.168.1.104"), 45454);

然后我可以强制在与该 IP 关联的本地网络上发送数据报(否则它似乎会随机选择一个)。但是,'bind' 函数设置套接字来监听数据包,我现在对此真的不感兴趣。这是控制使用哪个适配器的正确方法,还是有更直接的方法来做到这一点?

谢谢

【问题讨论】:

    标签: qt4 network-programming datagram


    【解决方案1】:

    你需要这样的东西

    QHostAddress myBroadcastAddress = QHostAddress("192.168.255.255");
    udpSocket->writeDatagram(datagram.data(),datagram.size(), myBroadcastAddress , 45454 )
    

    这将发送 udp 广播数据包。

    【讨论】:

    • 感谢您的建议,但是使用地址“192.168.255.255”并没有帮助。我的计算机在适配器 1 上的 IP 地址是 192.168.1.104,而在适配器 2 上的 IP 地址是 192.168.56.1,所以我假设使用上述地址它仍然选择了错误的适配器。但是,如果我使用“192.168.1.255”,它似乎确实有效。但是,我对网络没有太多经验。这将是多么强大。也就是说,它可以在任何(大多数)系统上运行吗?谢谢。
    【解决方案2】:

    子网的广播地址始终是子网中的最高地址。在你的情况下:

    适配器1:地址192.168.1.104子网掩码255.255.255.0广播:192.168.1.255

    适配器2:地址192.168.56.1子网掩码255.255.255.0广播:192.168.56.255

    所以你需要你想要广播的适配器的地址和子网掩码来找到正确的广播地址。

    如果您使用适配器地址和子网掩码来计算广播地址,这应该适用于 IPv4 网络。

    【讨论】:

    • QHostAddress::Broadcast 是一个常量,始终为 255.255.255.255,即通用广播地址。不幸的是,可以在任何适配器上工作的地址并不能告诉您的操作系统使用哪个适配器。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-02
    • 1970-01-01
    相关资源
    最近更新 更多