QT tcp通信 下位机作为tcp服务器发出的消息获取不到

假如foreach不循环 2017-03-16 06:39:43
如题,就是下位机作为tcp的服务端,我向它发送消息,它会回复我对应的消息答复,这些通过抓包工具都能看到的,但是我在写代码的时候,总是获取不到,不清楚是哪些问题,代码下面贴出来。。。
这是头文件
#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QTcpSocket>

namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
Q_OBJECT

public:
explicit MainWindow(QWidget *parent = 0);
~MainWindow();

private:
Ui::MainWindow *ui;

QTcpSocket *m_pSocket,*m_tcpsocket;

private slots:
void on_btnSend_clicked();
void test();
void on_pushButton_clicked();
void readMessage();
};

#endif // MAINWINDOW_H

源文件
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QMessageBox>
#include <QByteArray>
#include <QHostAddress>
#include "QDebug"
#include "QTimer"

MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
}

MainWindow::~MainWindow()
{
m_pSocket->disconnectFromHost();
m_pSocket->deleteLater();
delete ui;
}

void MainWindow::on_btnSend_clicked()
{
m_pSocket = new QTcpSocket(this);
QHostAddress addr;
addr.setAddress(QObject::tr("192.168.13.200"));
m_pSocket->connectToHost(addr, 6000);
m_pSocket->waitForConnected();


int i = 0;

QMessageBox::information(this, "提示", "ready to send!");

int iSize = 0;
int iBufLen = 0;

QByteArray arrBuf;
arrBuf.resize(512);
arrBuf[i++] = 0xFA;
arrBuf[i++] = 0xCE;

arrBuf[i++] = 0x00;
arrBuf[i++] = 0x01;

arrBuf[i++] = 0x00;
arrBuf[i++] = 0x01; // target

iSize = i;
arrBuf[i++] = 0x00;
arrBuf[i++] = 0x1C;


arrBuf[i++] = 0x00;
arrBuf[i++] = 0x12; // sender

arrBuf[i++] = 0x00;
arrBuf[i++] = 0x00;

arrBuf[i++] = 0x00;
arrBuf[i++] = 0x04;

iBufLen = i;
arrBuf[i++] = 0x00;
arrBuf[i++] = 0x04;

sprintf(arrBuf.data()+i, "TXML");

i += 4;

char *theBuf = "<Message namespace=\"ZH-606\" version=\"1.2\" type=\"request\" sequence=\"1\">"
"<Execute command=\"SYS_APPASSOCIATION\" enforce=\"true\"/>"
"</Message>";
quint16 iTmp = strlen(theBuf);
sprintf(arrBuf.data()+i, theBuf);
i += iTmp;
arrBuf[iBufLen] = (quint8)(iTmp>>8);
arrBuf[iBufLen+1] = (quint8)(iTmp);

arrBuf[i++] = 0x00;
arrBuf[i++] = 0x12;//SessionId

arrBuf[i++] = 0x00;
arrBuf[i++] = 0x01;//SliceNum分包计数

arrBuf[iSize] = (quint8)((i-8)>>8);
arrBuf[iSize+1] = (quint8)(i-8);

m_pSocket->write(arrBuf.data(), i);
}

void MainWindow::test()
{
qDebug()<<"test";
}

void MainWindow::on_pushButton_clicked()
{
m_tcpsocket = new QTcpSocket(this);
m_tcpsocket->abort();
QHostAddress addr;
addr.setAddress("192.168.13.200");
m_tcpsocket->connectToHost(addr,6000);
if (m_tcpsocket->waitForConnected())
{
qDebug() << "connected...";
}
else
{
qDebug() << "con error.";
}
connect(m_tcpsocket,SIGNAL(readyRead()),
this,SLOT(readMessage()));
}

void MainWindow::readMessage()
{
qDebug() << "read....";
qDebug()<<QString(m_tcpsocket->readAll().toHex());
while(m_tcpsocket->bytesAvailable()>0)
{
QByteArray datagram;
datagram.resize(m_tcpsocket->bytesAvailable());
m_tcpsocket->read(datagram.data(),datagram.size());
QString msg=datagram.data();
qDebug()<<msg;
}
}

main文件
#include "mainwindow.h"
#include <QApplication>

int main(int argc, char *argv[])
{
QApplication a(argc, argv);
MainWindow w;
w.show();

return a.exec();
}

请抽出您宝贵的时间瞅两眼,多谢
...全文
463 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
引用 3 楼 huayufei 的回复:
用两个TCPSocket呀
是的,后来发现了是这个问题,虽然早已解决,但还是谢谢,
huayufei 2017-03-24
  • 打赏
  • 举报
回复
一个就够了呀
huayufei 2017-03-24
  • 打赏
  • 举报
回复
用两个TCPSocket呀
  • 打赏
  • 举报
回复
引用 1 楼 u012332212 的回复:
这三张图分别是运行界面,实际发送的数据和实际接收的数据
可以看到接受的数据中有个type是respond,这表明是服务器回复我的消息,但是我程序中获取不到这个数据,该怎么实现呢,代码问题又在哪里呢
  • 打赏
  • 举报
回复

这三张图分别是运行界面,实际发送的数据和实际接收的数据

16,212

社区成员

发帖
与我相关
我的任务
社区描述
Qt 是一个跨平台应用程序框架。通过使用 Qt,您可以一次性开发应用程序和用户界面,然后将其部署到多个桌面和嵌入式操作系统,而无需重复编写源代码。
社区管理员
  • Qt
  • 亭台六七座
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧