gpt4 book ai didi

c++ - Qt:带有 QUdpSocket 的 SSDP 在极少数情况下工作

转载 作者:行者123 更新时间:2023-11-28 04:39:43 25 4
gpt4 key购买 nike

这个问题让我发疯了一段时间。由于我从来没有做过任何网络相关的代码,所以我无法得出这个实验的结果。

我获得了有关使用 SSDP 广播相关信息的服务器的信息。我按照标准获得了 IP 和端口。我还获得了需要在接收方使用的查询和搜索目标。我在这个例子中使用了我的最新迭代,在这个例子中我决定使用一个单例类来管理发现。我使用的真正 ST 字符串也是我提供的,请忽略下面的......

DiscoveryManager.h

class DiscoveryManager : public QObject
{

private:
DiscoveryManager( QObject *parent=0 );
public:
~DiscoveryManager();

// Public Accessor for the singleton instance of the class
static DiscoveryManager* Instance();

void Discover();

public:
void readPending();

private:
// Singleton instance of the class
static DiscoveryManager* _instance;
QUdpSocket* socket;
};

DiscoveryManager.cpp

// Definition of singleton instance
DiscoveryManager* DiscoveryManager::_instance;

// Network Parameters
quint16 port = 1900;
QHostAddress groupAddress = QHostAddress("239.255.255.250");

DiscoveryManager::DiscoveryManager(QObject *parent)
: QObject(parent)
, socket( nullptr )
{
socket = new QUdpSocket(this);
auto ok = m_sock->bind(QHostAddress::AnyIPv4, port, QUdpSocket::ShareAddress);
if (!ok)
{
printf("Bind Error\n");
return;
}

ok = socket->joinMulticastGroup(groupAddress);
if (!ok) {
printf("Join Multicast Group Failed\n");
return;
}

connect(socket, SIGNAL(readyRead()), this, SLOT(readPending()));
}

DiscoveryManager* DiscoveryManager::Instance()
{
if(_instance == nullptr)
{
_instance = new DiscoveryManager();
}
return _instance;
}

void
DiscoveryManager::startDiscovery()
{
QByteArray message("M-SEARCH * HTTP/1.1\r\n" \
"HOST: 239.255.255.250:1900\r\n" \
"MAN: \"ssdp:discover\"\r\n" \
"MX: 5\r\n" \
"ST: ***:******-****-***:*******:***********:*\r\n" \
"\r\n");

auto writeOk = socket->writeDatagram(message.data(), groupAddress, port);
if (writeOk == -1) {
printf("Writing Datagram failed\n");
return;
}
}


void
DiscoveryManager::readPending()
{
while (socket->hasPendingDatagrams()) {
QByteArray reply;
reply.resize(socket->pendingDatagramSize());
socket->readDatagram(reply.data(), reply.size());

// ... Parse Text Here ...
}
}

结果: 90% 的情况下,这会失败。当我尝试打印消息时,我得到的响应始终是我查询内容的回声。无论我离开它多久,正确的回应永远不会到来。另一方面,当条件“恰到好处”时,发现是完美的,总是立即返回结果。

预期结果:我希望看到包含位置等更多信息的服务器响应。

注意事项:

  1. 由于我很难理解为什么网络相关代码会失败,所以我无法从结果中得出结论是我的接收器代码不正确,还是服务器设置不正确。我可以使用什么指标?在空间中设置 VPN 之类的东西会影响这个吗?服务器是否在我的本地计算机上运行是否重要?
  2. 我经历了很多次迭代,尝试使用不同的连接标志,在再次尝试之前销毁和重置对象或套接字,甚至执行了一个循环,查询次数超过 5000 次以了解行为。
  3. 如果这段代码看起来不像,我已尝试重现 Qt 文档提供的完全相同的代码和顺序。

最佳答案

我在 Mac 上遇到了类似的问题,但在 iOS 上遇到了不同的代码。你设法修好了吗?怎么办?

好吧,我必须获得响应的唯一方法是绑定(bind)到与 1900 不同的端口,但我不知道这是否是正确的方法。我通过使用 wireshark 发现了这一点,例如 Google Chrome 在发送 M-SEARCH 时使用“随机”端口作为源端口,并使用 1900 作为目标。

通过将绑定(bind)端口设置为 1900,我只能将数据报发送到“239.255.255.250”,例如其他软件 M-SEARCH 或设备 NOTIFY 消息。

这是为了让您的代码正常工作:

auto ok = m_sock->bind(QHostAddress::AnyIPv4, 56123, QUdpSocket::ShareAddress);

关于c++ - Qt:带有 QUdpSocket 的 SSDP 在极少数情况下工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50494278/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com