- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
这个问题让我发疯了一段时间。由于我从来没有做过任何网络相关的代码,所以我无法得出这个实验的结果。
我获得了有关使用 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% 的情况下,这会失败。当我尝试打印消息时,我得到的响应始终是我查询内容的回声。无论我离开它多久,正确的回应永远不会到来。另一方面,当条件“恰到好处”时,发现是完美的,总是立即返回结果。
预期结果:我希望看到包含位置等更多信息的服务器响应。
注意事项:
最佳答案
我在 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/
我通过 udp 拆分帧 (50Kb) 并将 frameId 添加到数据中,将未打包的图像 (bmp) 数据从一个应用程序 (unity) 发送到另一个应用程序 (QT)。另一方面,我正在尝试集成帧(使
各位! 我在使用 QUdpSocket 和 readyRead 信号时遇到一个奇怪的问题,我可以说它没有像我想的那样工作, 我创建了一个 QUdpSocket 并将其绑定(bind)到某个端口,将 r
如果我在从客户端到服务器的 udp 套接字(在我的例子中是 QUdpSocket)上连续写入 2 次,我是否可能只收到一个数据报,其中包含我从客户端写入的两个数据?或者我确定我总是会得到 2 个单独的
我有一个使用 QUdpSocket 的服务器程序。 如何找到发件人的 IP 地址? 最佳答案 来自 http://doc.qt.io/archives/4.6/qudpsocket.html#read
我对 QUdpSocket 有疑问。我想创建一个简单的程序来使用 UDP 协议(protocol)发送和接收数据。我已经阅读了许多类似的主题,但我没有找到解决的方法。通信仅适用于 QHostAdres
我正在尝试编写一个小型 UDP 服务器应用程序。 我有一个客户端传输到这个应用程序套接字,我已经使用一个小的 UDP 回显程序(它将端口上接收到的数据回显到屏幕上)验证了它发送正常,而且,我可以看到在
我正在使用 Qt5,我正在尝试通过 QUdpProtocol 在 QDataStream 中使用 QByteArray 数据包发送 QPixmap。发送像素图很简单(并且正确?): QByteArra
我正在尝试使用 QUdpSocket 发送数据报。以下是我使用的代码: udpSocket = new QUdpSocket(this); QByteArray datagram = "Message
我在 QUdpSocket 上收到了两次数据报,即使我在 wireshark 上观看并且只收到一次。我创建套接字并在端口 11112 上监听。还有另一个设备在我正在监听的这个端口上发出数据。对于发送的
我正在编写一个使用 QUdpSockets 的应用程序。由于使用 operator new 创建套接字导致内存出现问题,我想知道是否有必要在关闭后删除它们。 代码如下: socket = new QU
假设我有一个直接连接到互联网的服务器和一个连接到路由器的客户端。客户端可以向服务器发送消息,因为它知道服务器的 IP 地址和端口。但是服务器如何将消息发送回客户端呢?它可以获得客户端的外部 IP 地址
我在工作线程中有 QUdpsSocket。我应该如何将传入数据(指针、qbytearray、复制 uint8_t[]、..?)发送到主线程?我应该在哪里删除它? 在本地网络中大约每秒 6000 个数据
嗨,希望有人能帮助我,我正在编写一个小 GUI,它将通过 UDP 套接字发送的数据进行图形化。我决定使用 PyQt 的 QUdpSocket 来实现这一点。我使用了示例代码(我用它来测试我的服务器),
我尝试在QT中使用下面的头文件: #include 但是我得到了错误: QUdpSocket: No such file or directory 最佳答案 你加了吗 QT += network 在
我正在使用 QUdpSocket 从服务器接收数据。当我使用 SFML 接收数据时,我可以通过 SocketUdp 接收数据,但是使用 qt 它不起作用。 void TheClass::Bind()
我在使用 QT Udp 套接字时遇到问题。假设所有标题都正确包含,我正在写: QUdpSocket* s = new QUdpSocket(); bool ok = s->bind(QHostAddr
我遇到了 QUdpSocket 的问题。信号 readyRead() 似乎从未发出过。因此,我决定创建 QTimer 并检查套接字读取队列的状态。这样我确保套接字正常工作(bytesAvailable
我想使用一些标准的QUdpSocket 方法,确切地说是read() 和readAll()。所以,根据QUdpSocket的文档: If you want to use the standard QI
我正在使用 QT Creator 构建一个接收 UDP 数据包的程序。 我试图包含 QUdpSocket 库,但它抛出以下错误(在同一行中重复三次): mainwindow.h:6: error: C
我实际上是在尝试使用 Qt4 制作 DNS 代理应用程序。如果我将 DNS 名称服务器设置为“localhost”,那么我想将所有 DNS 请求转发到 remoteSocket 对象中指定的服务器。除
我是一名优秀的程序员,十分优秀!