我对Qt不熟悉,所以如果这是个愚蠢的问题.
我正在尝试使用QTcpSocket。
如果我这样做了:
...
QTcpSocket * socket
socket = new QTcpSocket(this);
socket.write(1);
...它抱怨with ()不使用整数(不是const *)。
如果我这样做了:
...
QTcpSocket * socket
socket = new QTcpSocket(this);
socket.write("1");
...另一方将其视为整数49 (ASCII为1)。
在一个类似但不同的问题上,是否可以通过QTcpSocket发送结构或联合?
==================================================
编辑
服务器已经接受整数,并期待一个整数-我对此没有控制权。
发布于 2011-08-16 18:16:37
您所遇到的问题实际上与Qt无关,任何其他套接字或流接口都会出现同样的问题。
服务器的提供者需要为您提供协议描述。这种描述通常包含所使用的端口(TCP、UDP、numbers)、其他TCP参数和传输数据的编码。有时,这个协议(或它的实现)被称为(协议-)堆栈。
编码不仅包含字节排序,而且还描述了如何传输复杂的结构。后一种信息通常被编码为"ASN.1“--抽象语法符号。
如果您的服务器非常简单,只是一个接一个地接受整数,没有任何元信息,并且位于同一个平台上,那么您可以这样做:
foreach (int i in my set of integers)
{
ioDevice->write((const char*) &i, sizeof(i));
}您可以将整数的地址作为数据缓冲区开始,并传输整数所具有的字节数。但是请注意,如果您将数据从英特尔架构传输到16位架构或摩托罗拉PPC,这将失败。
发布于 2011-08-17 06:10:58
我建议在套接字中使用QDataStream。这将保护您免受小端点/大端点转换问题的影响。
因此,如下所示:
qint32 myData = 1;
QDataStream os( &mySocket );
os << myData;发布于 2011-08-16 16:11:48
当您在字符串表示中写入时,还必须在另一侧解释字符串。例如,有QString::toInt()。
当您想要将整数写入整数时,您将有更多的吞吐量,因为传输所需的字节较少。但是,您应该阅读有关网络字节顺序的主题。
原则上,可以将结构等复制到缓冲区中,也可以通过网络复制。然而,当您在不同的体系结构之间传输数据,甚至只在不同的软件构建之间传输数据时,事情又变得复杂起来。因此,您不应该发送原始数据,而是使用序列化!参见这个问题:用Qt序列化
它提供了如何从对象生成流和从流生成对象的答案。这些流是您随后用来通过网络传输的。那么你就不用再处理整数本身了!
https://stackoverflow.com/questions/7081214
复制相似问题