首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在QTcpSocket上发送整数?

如何在QTcpSocket上发送整数?
EN

Stack Overflow用户
提问于 2011-08-16 16:02:25
回答 4查看 6.7K关注 0票数 2

我对Qt不熟悉,所以如果这是个愚蠢的问题.

我正在尝试使用QTcpSocket。

如果我这样做了:

代码语言:javascript
复制
...
QTcpSocket * socket
socket = new QTcpSocket(this);
socket.write(1);
...

它抱怨with ()不使用整数(不是const *)。

如果我这样做了:

代码语言:javascript
复制
...
QTcpSocket * socket
socket = new QTcpSocket(this);
socket.write("1");
...

另一方将其视为整数49 (ASCII为1)。

在一个类似但不同的问题上,是否可以通过QTcpSocket发送结构或联合?

==================================================

编辑

服务器已经接受整数,并期待一个整数-我对此没有控制权。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2011-08-16 18:16:37

您所遇到的问题实际上与Qt无关,任何其他套接字或流接口都会出现同样的问题。

服务器的提供者需要为您提供协议描述。这种描述通常包含所使用的端口(TCP、UDP、numbers)、其他TCP参数和传输数据的编码。有时,这个协议(或它的实现)被称为(协议-)堆栈。

编码不仅包含字节排序,而且还描述了如何传输复杂的结构。后一种信息通常被编码为"ASN.1“--抽象语法符号。

如果您的服务器非常简单,只是一个接一个地接受整数,没有任何元信息,并且位于同一个平台上,那么您可以这样做:

代码语言:javascript
复制
foreach (int i in my set of integers)
{
   ioDevice->write((const char*) &i, sizeof(i));
}

您可以将整数的地址作为数据缓冲区开始,并传输整数所具有的字节数。但是请注意,如果您将数据从英特尔架构传输到16位架构或摩托罗拉PPC,这将失败。

票数 4
EN

Stack Overflow用户

发布于 2011-08-17 06:10:58

我建议在套接字中使用QDataStream。这将保护您免受小端点/大端点转换问题的影响。

因此,如下所示:

代码语言:javascript
复制
qint32 myData = 1;
QDataStream os( &mySocket );
os << myData;
票数 4
EN

Stack Overflow用户

发布于 2011-08-16 16:11:48

当您在字符串表示中写入时,还必须在另一侧解释字符串。例如,有QString::toInt()

当您想要将整数写入整数时,您将有更多的吞吐量,因为传输所需的字节较少。但是,您应该阅读有关网络字节顺序的主题。

原则上,可以将结构等复制到缓冲区中,也可以通过网络复制。然而,当您在不同的体系结构之间传输数据,甚至只在不同的软件构建之间传输数据时,事情又变得复杂起来。因此,您不应该发送原始数据,而是使用序列化!参见这个问题:用Qt序列化

它提供了如何从对象生成流和从流生成对象的答案。这些流是您随后用来通过网络传输的。那么你就不用再处理整数本身了!

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7081214

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档