c++ - QTcpSocket 模拟 netcat '对话'
问题描述
在我的 linux 终端中,我有以下“对话”,我想使用 QTcpSocket 从 qt 运行:
S user@domain:~ $ netcat 1.1.1.2 9230
R HELO SOME MORE INFORMATION ABOUT THE DEVICE I CONNECTED TO
S DEVC 1.1.1.1 somePassword
R DEVC OK
S @AlarmCode=2,12
其中 S 是发送的数据,R 是接收的数据。
我做了以下代码,我的头文件:
#ifndef TCPCLIENT_H
#define TCPCLIENT_H
#include <QTcpSocket>
#include <QObject>
class TCPClient : public QObject
{
Q_OBJECT
private:
QTcpSocket *tcpSocket = nullptr;
void handleHeloMessage(QString message);
void handleConnectToDeviceMessage(QString message);
void handleMessage(QString message);
bool handledHeloMessage = false;
bool handledConnectToDeviceMessage = false;
void sendDeviceToConnectTo();
private slots:
void onConnected();
void handleReadyRead();
public:
TCPClient();
};
#endif // TCPCLIENT_H
我的cp:
#include "tcpclient.h"
#include <QDataStream>
#include <QDebug>
const QString COMMAND_RESET_ALARM = "@AlarmCode=1,-";
const QString COMMAND_CONNECT_TO_DEVICE = "DEVC 1.1.1.1 somePassword";
const QString IP_DATA_SOURCE = "1.1.1.2";
const int PORT_DATA_SOURCE = 9230;
#include <QDebug>
TCPClient::TCPClient()
{
tcpSocket = new QTcpSocket(this);
connect(tcpSocket, SIGNAL(connected()), this, SLOT(onConnected()));
connect(tcpSocket, SIGNAL(readyRead()), SLOT(handleReadyRead()));
tcpSocket->connectToHost(IP_DATA_SOURCE, PORT_DATA_SOURCE);
}
void TCPClient::handleHeloMessage(QString message)
{
if(message.left(4) == "HELO")
{
handledHeloMessage = true;
qDebug() << "Handled HELO \n" << message;
sendDeviceToConnectTo();
}
else{
qDebug() << "We did not receive halo but \n" << message;
}
}
void TCPClient::handleConnectToDeviceMessage(QString message)
{
qDebug() << "RECEIVED DEVICE\n" << message;
}
void TCPClient::handleMessage(QString message)
{
qDebug() << "We received data. "<< message;
}
void TCPClient::sendDeviceToConnectTo()
{
QByteArray br = COMMAND_CONNECT_TO_DEVICE.toUtf8();
tcpSocket->write(br);
qDebug() << "Sending: " << br;
}
void TCPClient::onConnected()
{
qDebug() << "we are now connected.";
}
void TCPClient::handleReadyRead()
{
QByteArray dataReceived = tcpSocket->readAll();
QString dataReceivedString = QString::fromStdString(dataReceived.toStdString());
if(!handledHeloMessage)
{
handleHeloMessage(dataReceivedString);
}
else if(!handledConnectToDeviceMessage)
{
handleConnectToDeviceMessage(dataReceivedString);
}
else{
handleMessage(dataReceivedString);
}
}
当我运行我的程序时,我得到:
we are now connected.
Handled HELO
"HELO SOME MORE INFORMATION ABOUT THE DEVICE I CONNECTED TO"
Sending: "DEVC 1.1.1.1 somePassword"
我期待接下来会收到 DEVC OK,但以上部分就是我所得到的。为什么我没有收到DEVC OK
来自终端的示例?
解决方案
我发现了问题,直到输入新行才写入消息。添加\n
到消息中完成了这项工作。
推荐阅读
- excel - 基于一个条件转置行和列的 VBA 宏
- tfs - 如何使用 TFS 在子文件夹上选择相同的扩展文件?
- reactjs - 如何从 Next Js URL 中删除子文件夹名称?
- iis - 如何在 IIS/Plesk 上将签名算法更改为 SHA-2
- csv - CSV 查找并保存到新文件
- python - urllib.error.URLError:
- mysql - BigQuery 中 MySQL 的 binary(8) 和 varbinary(16) 的等价物是什么?
- azure - 在 Azure Function 中编写视频
- c# - 使用公钥和私钥发送加密和签名的电子邮件,以便在 FMCSA 中提交数据
- pyqt5 - 从 QtWebEnginePage 获取重定向 url