【发布时间】:2017-07-31 13:56:18
【问题描述】:
我正在尝试编写一个 QT 程序来接收 UDP 数据包。我正在尝试从 Packet Sender 软件接收 这是我的代码
socket = new QUdpSocket(this);
bool result = socket->bind(QHostAddress("150.100.50.88"),45454);
qDebug() << result;
if(result)
{
qDebug << "PASS";
}
else
{
qDebug << "FAIL";
}
processPendingDatagrams();
connect(socket, SIGNAL(readyRead()), this, SLOT(processPendingDatagrams()),Qt::QueuedConnection);
void UDP::processPendingDatagrams()
{
QHostAddress sender;
u_int16_t port;
while (socket->hasPendingDatagrams())
{
QByteArray datagram;
datagram.resize(socket->pendingDatagramSize());
socket->readDatagram(datagram.data(),datagram.size(),&sender,&port);
qDebug() <<"Message From :: " << sender.toString();
qDebug() <<"Port From :: "<< port;
qDebug() <<"Message :: " << datagram;
} //! [2]
}
UDP.h:
class UDP : public QObject
{
Q_OBJECT public:
explicit UDP(QObject *parent = 0);
signals:
public slots:
void SendDatagram(u_int8_t,u_int8_t,u_int8_t);
private slots:
void processPendingDatagrams();
private :
QUdpSocket *socket;
};
readReady 信号和相应的插槽不工作。我可以在 Wireshark 中看到数据包。 如果我尝试在循环中连续接收数据包,我可以看到数据报。信号和插槽无法正常工作的原因可能是什么。发送操作运行良好。
【问题讨论】:
-
是插槽中.h 中的 void UDP::processPendingDatagrams() 定义,而不仅仅是函数? (带有公共/受保护/私有插槽:)
-
void UDP::processPendingDatagrams() 被声明为公共函数而不是插槽。我已将类添加到我的问题中
-
如果你想像在connect中一样把它当作一个槽使用,你应该把它移到槽中。如果它是一个函数,它将不会被调用,因为 Qt 无法将它与信号链接。
-
我已将声明移至 Slots,即使在此之后没有任何变化。在 wireshark 中,我得到 Destination Unreachable (port unreachable)。
-
如果 oyu 在这里接收数据包,您应该将 ip 更改为 QHostAddress::AnyIPv4。并尝试另一个端口。 (如果你在linux上,你可以尝试用nc通过netcat发送udp数据包)