linux - 在Qt中通过套接字发送结构

标签 linux qt struct

我正在编写一个客户端服务器应用程序来在Linux平台上传输数据。我正在 QT 中为客户端开发一个 GUI 应用程序。我只是 QT 的初学者,请帮助将结构从服务器端传输到客户端。 为非GUI环境编写的服务器端代码

#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <errno.h>
#include <string.h>
#include <sys/types.h>
#pragma pack(1)
struct basestruct
{
int element1;
int element2;
};
#pragma pack(0)
struct basestruct newstruct;
int main(int argc, char *argv[])
{
int listenfd = 0, connfd = 0,n=0;
struct sockaddr_in serv_addr; 
char sendBuff[1025];
listenfd = socket(AF_INET, SOCK_STREAM, 0);
memset(&serv_addr, '0', sizeof(serv_addr));
memset(sendBuff, '0', sizeof(sendBuff)); 

serv_addr.sin_family = AF_INET;
serv_addr.sin_addr.s_addr = htonl(INADDR_ANY);
serv_addr.sin_port = htons(5000); 

bind(listenfd, (struct sockaddr*)&serv_addr, sizeof(serv_addr)); 

listen(listenfd, 10); 

while(1)
{
    connfd = accept(listenfd, (struct sockaddr*)NULL, NULL); 
newstruct.element1=1;
newstruct.element2=2;
    if((n=send(connfd,(void *)&newstruct,sizeof(struct basestruct),0))<0)
     perror("Write error");
printf("sent items :%d \n",n);
    close(connfd);
    sleep(1);
 }}`

QT编写的客户端代码

#include "dialog.h"
#include "ui_dialog.h"
#include <QString>
#include <QDebug>
#include <QTextStream>
#include <QByteRef>
struct basestruct
{
int element1;
int element2;
};
basestruct newstruct;
Dialog::Dialog(QWidget *parent) :
QDialog(parent),
ui(new Ui::Dialog)
{
ui->setupUi(this);
ui->pushButton->setText("Connect");
ui->pushButton_2->setText("Ok");
ui->pushButton_3->setText("Close");
ui->pushButton_4->setText("Disconnect");
}
Dialog::~Dialog()
{
delete ui;
}
void Dialog::Read()
{
socket->waitForReadyRead(-1);
QByteArray byteArray;

byteArray=socket->readAll();
deserialize(byteArray);
qDebug()<<socket->readAll();
qDebug()<<"Read contents";
socket->flush();
}
void Dialog::on_pushButton_clicked()
{
socket=new QTcpSocket(this);
socket->connectToHost("127.0.0.1",5000);
qDebug()<<"Connected";
Read();
}
void Dialog::on_pushButton_4_clicked()
{
socket->close();
qDebug()<<"Disconnected";
}
void Dialog::deserialize(const QByteArray& byteArray)
{
QDataStream stream(byteArray);
stream.setVersion(QDataStream::Qt_4_0);
qDebug()<<"size received" <<byteArray.size();
stream >> newstruct.element1
>> newstruct.element2;
qDebug()<<"Element1"<<newstruct.element1<<"Element2"<<newstruct.element2;
}

当我收到结构并使用 qDebug() 打印时,我得到了一些垃圾值。请帮助我并指出我出错的地方。是否有任何简单的替代方法可以在 QT 中传输结构而无需序列化(类似于非 GUI 应用程序)。 提前致谢

最佳答案

可以通过将 Endianness 指定为以下方式来解决 Endianness 问题: Stream.setByteOrder(QDataStream::LittleEndian); 在声明 Qdatastream 后的反序列化函数中。

关于linux - 在Qt中通过套接字发送结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28803009/

相关文章:

linux - 如何在 node.js 应用程序中接收外部程序事件并影响当前的 Socket.IO 连接?

c++ - 可停靠窗口中的 Qt 填充和边距

c - 错误 : Storage size of a isn't known

linux - 如何为 Linux 制作 Qt 应用程序的二进制分发

qt - 带有可拉伸(stretch)分隔符的 QBoxLayout

C++将数据从数据文件输入到结构变量中

c - C中的双向链表排序函数

c - 在 Linux 编程中通过管道在进程之间发送链表结构的最佳方法是什么

c++ - 使用c++更改任何linux用户密码

linux - CentOS 6.5 如何让新文件继承父文件夹所有权?