2

我是 Qt 的新手,所以如果这是一个完全愚蠢的问题......

我正在尝试使用 QTcpSocket。

如果我做:

...
QTcpSocket * socket
socket = new QTcpSocket(this);
socket.write(1);
...

它抱怨 write() 不适用于整数(不是 const char *)。

如果我做:

...
QTcpSocket * socket
socket = new QTcpSocket(this);
socket.write("1");
...

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

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

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

编辑

服务器已经接受整数,并且期待一个整数 - 我无法控制它。

4

4 回答 4

4

您遇到的问题与 Qt 无关,任何其他 Socket 或 Streaming 接口都会出现同样的问题。

服务器的提供者需要给你协议描述。此描述通常包含使用的端口(TCP、UDP、数字)、其他 TCP 参数和传输数据的编码。有时,此协议(或其实现)称为(协议)堆栈。

编码不仅包含字节顺序,还包含对复杂结构如何传输的描述。后面的信息通常被编码为“ASN.1”——抽象语法符号。

如果您的服务器真的很简单并且只是一个接一个地接受整数而没有任何元信息并且在同一平台上,那么您可以执行以下操作:

foreach (int i in my set of integers)
{
   ioDevice->write((const char*) &i, sizeof(i));
}

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

于 2011-08-16T18:16:37.947 回答
4

我建议将QDataStream与套接字一起使用。这将保护您免受小端/大端转换问题。

所以如下:

qint32 myData = 1;
QDataStream os( &mySocket );
os << myData;
于 2011-08-17T06:10:58.243 回答
1

当您以字符串表示形式编写时,您还必须解释另一端的字符串。例如,有QString::toInt()

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

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

它提供了有关如何从对象中生成流和从流中生成对象的答案。这些流是您随后用于通过网络传输的内容。然后你就不必再自己处理整数了!

于 2011-08-16T16:11:48.497 回答
0

不同的重载,您正在寻找:

qint64 QIODevice::write ( const char * data, qint64 maxSize );

qint64 QIODevice::write ( const QByteArray & byteArray );
于 2011-08-16T16:13:26.610 回答