私の短いQUdpSocket
例が機能しない理由を見つけるのに問題があります。ポート 2007 で 192.168.2.66 にある組み込みデバイスの読み取りと書き込みに UDP ソケットを 1 つだけ使用する予定です。デバイスは常にポート 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 内の部分は、ソケットがデータを受信したかどうかを確認するために追加されました)
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);
}
//------------------------------------------------------------------------
そして、これは私のテスト receive() メソッドです...シグナルスロットが機能するかどうかを確認するためだけに書きました:
void QUdp::received()
{
int64_t iRecvCount = OUdp->bytesAvailable();
}
//------------------------------------------------------------------------
何が悪いのかわかりません.. QtでUDPソケットを1つだけ使用して読み書きできないという投稿をいくつか見つけました(QtはBSDソケットを使用するため、可能であるはずです)が、私の例は提案された解決策のように見えるので、何が機能していないのか本当にわかりません。