我很难找到为什么我的简短QUdpSocket
示例不起作用。我计划仅使用一个 UDP 套接字在 192.168.2.66 端口 2007 上读取和写入嵌入式设备。设备将始终在端口 2007 上回复发送者。我使用 UDP 终端软件测试了该设备,并按我说的那样工作。因此,我设计了一个简单的类来嵌入管理设备所需的功能:
class QUdp : public QObject
{
// Q_OBJECT
public:
explicit QUdp(QObject *parent = 0, const char *szHost = 0, uint16_t wPort = 0);
~QUdp();
bool Open();
int64_t Write(QByteArray &data);
int64_t Write(QString strData);
private:
QString m_strHost;
uint16_t m_wPort;
QUdpSocket *OUdp;
private slots:
void received();
};
我想问题出在 Open 方法中:
bool QUdp::Open()
{
QHostAddress OHost;
connect(OUdp, &QUdpSocket::readyRead, this, &QUdp::received);
bool zRet = OUdp->bind(QHostAddress::AnyIPv4, m_wPort, QUdpSocket::ShareAddress);
OHost.setAddress(m_strHost);
OUdp->connectToHost(OHost, m_wPort, QIODevice::ReadWrite);
return(zRet);
}
//------------------------------------------------------------------------
我对 connect() 使用 Qt 5 语法,m_strHost
值是“192.168.2.66”并且m_wPort
是 2007
我的Write方法很简单(加了#if 0里面的部分,看socket有没有收到数据)
int64_t QUdp::Write(QString strData)
{
QByteArray data(strData.toStdString().c_str(), strData.length());
int64_t iCount = OUdp->write(data);
#if 0
bool zRecved = OUdp->waitForReadyRead(3000);
int64_t iRecvCount = OUdp->bytesAvailable();
#endif
return(iCount);
}
//------------------------------------------------------------------------
这是我的测试接收()方法......我写它只是为了看看信号槽是否有效:
void QUdp::received()
{
int64_t iRecvCount = OUdp->bytesAvailable();
}
//------------------------------------------------------------------------
我不明白出了什么问题。我发现一些帖子说在 Qt 中仅使用一个 UDP 套接字是不可能读写的(Qt 使用 BSD 套接字,所以应该是可能的)但是我的示例看起来是建议的解决方案,所以我真的不明白什么是行不通的。