gpt4 book ai didi

c++ - QUdpSocket - 数据报被接收两次,为什么?

转载 作者:行者123 更新时间:2023-11-28 04:30:24 29 4
gpt4 key购买 nike

我在 QUdpSocket 上收到了两次数据报,即使我在 wireshark 上观看并且只收到一次。我创建套接字并在端口 11112 上监听。还有另一个设备在我正在监听的这个端口上发出数据。对于发送的每条实际消息,我始终会收到两条消息。我不确定是什么原因造成的。有什么想法吗?

精简代码:

    MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
m_socket = new QUdpSocket(this);
connect (m_socket, SIGNAL(stateChanged(QAbstractSocket::SocketState)), this, SLOT(onSocketStateChange(QAbstractSocket::SocketState)));
m_socket->bind(11112, QUdpSocket::ShareAddress);
}

MainWindow::~MainWindow()
{
delete ui;
delete m_socket;
}

void MainWindow::readPendingDatagrams()
{
QByteArray buffer;
QHostAddress sender;
quint16 port;

while(m_socket->hasPendingDatagrams())
{
int s = m_socket->pendingDatagramSize();
buffer.resize(s);
//for some reason there are two datagrams on the line.
// I have verified with wireshark that there is only one from the
// sender so not sure what is happening under the hood...
m_socket->readDatagram(buffer.data(),buffer.size(),&sender, &port);

QString source = sender.toString().split(":")[3];
if (source == "172.20.23.86")
{
qInfo() << buffer <<endl;
}
}


}

void MainWindow::onSocketStateChange(QAbstractSocket::SocketState state)
{
if ( state == QAbstractSocket::BoundState ) {
connect(m_socket, SIGNAL(readyRead()), this, SLOT(readPendingDatagrams()));
}

}

最佳答案

如果数据报被发送到广播地址,并且您绑定(bind)到所有接口(interface) (0.0.0.0),并且有两个接口(interface)接收数据报,则可能会发生这种情况。要排除这种可能性,请切换到 receiveDatagram API 并转储您收到的数据报的完整详细信息。我敢打赌,您收到它的界面每次都会不同。

您还可能多次连接 readPendingDatagrams 插槽,因此它可能会被触发多次,尽管 hasPendingDatagrams 应该返回 false第二次 - 所以虽然这可能不是问题,但它是您必须解决的问题。它应该只连接一次 - 当您构造套接字时,即在构造函数中。

关于c++ - QUdpSocket - 数据报被接收两次,为什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53106863/

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