在Wireshark中看到的数据报,未由QT UDP套接字收到



我正在编写QT(5.6)应用程序,该应用程序与UDP套接字通过FPGA通信。数据包以2 kHz的形式流到PC(所有数据包相同尺寸,1272字节)。Wireshark表明正在发送数据包,并且UDP标头是预期的。问题是,我正在使用的QT UDP插座永远不会接收这些数据包。 ReadyRead 信号从未被调用。

这是一个代码段:

UdpConnection::UdpConnection(QObject* parent)
{
    fpgaConnection = QSharedPointer<QUdpSocket>(new QUdpSocket);
    qDebug() << connect(fpgaConnection.data(), &QUdpSocket::readyRead, this, &UdpConnection::readyRead);
    if (fpgaConnection->bind(QHostAddress("192.168.10.10"), 1920))
    {
        qDebug() << "Successfully Bound!";
    }
    else
    {
        qDebug() << "BINDING FAILURE";
    }
    fpgaConnection->connectToHost(QHostAddress("192.168.10.200"), 1919);
    sendArpRequest();
}
void UdpConnection::readyRead()
{
    while (fpgaConnection->hasPendingDatagrams())
    {
        QByteArray buffer;
        buffer.resize(fpgaConnection->pendingDatagramSize());
        QHostAddress sender;
        quint16 senderPort;
        fpgaConnection->readDatagram(buffer.data(), buffer.size(), &sender, &senderPort);
        qDebug() << "Message from:" << sender;
        qDebug() << "Message port:" << senderPort;
        qDebug() << buffer;
    }
}
  • udpConnection没有在与MAIN的单独线程上运行。应该是吗?
  • 我成功地绑定了,我认为" ConnectToHost"正在起作用,因为我能够将消息发送给远程主机。
  • 该应用程序已添加到防火墙异常列表中(同样,ARP握手证明它们能够通信)。
  • 接口是FPGA和PC之间的直接以太网连接。

为什么Wireshark能够看到这些消息,但我的程序却没有?

更新#1 Wireshark的2kHz数据包作为LLC数据包。以太网标头显示正确的目的地(我的MAC地址),源地址(在FPGA中进行了硬编码)和长度。IP标头的源IP为192.168.10.200,目的地IP为192.168.10.10,UDP标头的源端口为1920年,目标端口为1919。

更新#2 Wireshark日志:paste.ee/p/98c1h如您所见,该数据包已重复并从2KHz的FPGA发送。ARP的传输和答复可以找到为第五,第10和第11包。

更新#3 传入数据包的IP数据包具有未设置为0x0000的正确校验和。

我对QT不太熟悉,但对于BSD插座API,我通常使用bind来设置接收端口,但不要将连接用于UDP连接1919 vs 1920对于套接字API,请使用sendto()用于带目标IP/端口的数据包。

因此,尝试评论连接霍斯特,并在发送时直接使用WritedAtagram。

数据包似乎不是有效的UDP数据报。

编辑

摆弄数据包后,似乎足以将以太网标题中的类型更改为IPv4(0x0800)。

它确实显示一个奇怪的 ttl 值为0,但这可能与发件人相关。

原始帖子

而不是当前数据,您应该像拥有有效数据报:

这样发送。

以太网标题w/ipv4 (14byte):(如您的实现中,但键入IPv4 0x0800),源,dest,type

64006a493488 020826283900 0800

ipv4-headers (20 byte):版本,其他,size = 1298(0512)udp 20,Ident,flags(0x00),flagoffset(0),flagoffset(0),ttl(128),协议(17 UDP),校验和来源= .10.200,dest = .10.10

45 00 0512 31f0 00 00 80 11 0000 c0a80ac8 c0a80a0a

udp-header (8byte):source = 1919,dest = 1920,长度= 1278(04fe)= data 8,checksum 2byte未计算示例!

077f 0780 003e 9672

datapayload :1270原始数据字节

0a9f....

使用此数据报,您实际上不应该使用connectToHost(),而应使用writeDatagram(),现在可能通过信号使用readyRead()hasPendingDatagrams()readDatagram()

尝试使用NC尝试并验证从FPGA接收的数据包

nc -lu 192.168.10.10 1920 

如果您使用NC的数据包,则问题在于您的QT代码。您可以在连接的最后(可选)参数中尝试QT :: DirectConnection。也许您阻止当前线程和程序计数器再也不会到达事件循环,因此实际上不会调用插槽。

相关内容

最新更新