gpt4 book ai didi

c++ - 应答一个 UDP 数据包

转载 作者:塔克拉玛干 更新时间:2023-11-03 08:08:14 25 4
gpt4 key购买 nike

我有一个使用以下代码的 UDP 服务器:

void initialize() 
{
connect(&_udpSocket, SIGNAL(readyRead()), this, SLOT(onUdpDatagram()));

_udpSocket.bind(QHostAddress::Any, 28283);
}

void onUdpDatagram()
{
qDebug() << "udp packet received!";
_udpSocket.write("Hello");
}

不幸的是,当收到一个 UDP 数据包时,我在日志中有以下错误:

QIODevice::write: device not open

如何使 UDP 套接字可写?我试图为连接到发件人地址和端口的答案创建另一个套接字,但发送将不再使用 28283 端口......

有什么想法吗?

有关信息:我在 MacOS 10.9 上使用 Qt 5.2.1

最佳答案

UDP 不是基于连接的协议(protocol)。您不会为每个对等点获得一个单独的套接字,而是一个套接字用于单个端口上的所有通信。

因此,需要一些额外的努力来回复传入的 UDP 数据包。您需要从收到的数据报中检索发件人地址,然后发回同一地址。在套接字 API 中,这是通过使用 recvfromsendto 函数而不是 recv(或 read)和 send(或 write)——后者专为连接套接字而设计,就像您使用 TCP 一样。

您没有显示_udpSocket 变量的声明(实际上是类型),所以我假设您使用的是QUdpSocket。在这种情况下,您似乎需要使用 readDatagramwriteDatagram recvfromsendto 函数有一个额外的参数用于对等地址(实际上,它是一对,一个用于 IP 地址,一个用于端口)。

这是 Qt 文档对此的描述:

The most common way to use this class is to bind to an address and port using bind(), then call writeDatagram() and readDatagram() to transfer data. If you want to use the standard QIODevice functions read(), readLine(), write(), etc., you must first connect the socket directly to a peer by calling connectToHost().

关于c++ - 应答一个 UDP 数据包,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24873612/

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