我是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发送结构或联合?
=============================================== ===
修改:
服务器已经接受整数,并且期望一个整数 - 我无法控制它。
答案 0 :(得分: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,则会失败。
答案 1 :(得分:4)
我建议将QDataStream与套接字一起使用。这样可以保护您免受 little endian / big endian 转换问题的影响。
如下所示:
qint32 myData = 1;
QDataStream os( &mySocket );
os << myData;
答案 2 :(得分:1)
当您在字符串表示中写入时,您还必须解释另一侧的字符串。例如,有QString::toInt()。
如果要将整数写为整数,则会有更多的吞吐量,因为传输的字节数更少。但是,您应该阅读网络字节顺序主题。
原则上,可以将结构等复制到缓冲区中,也可以通过网络复制。但是,当您在不同的体系结构之间传输数据时,甚至只是软件的不同版本时,事情会再次变得复杂。所以你不应该发送原始数据,而是使用序列化!看到这个问题: Serialization with Qt
它提供了有关如何从流中生成对象和对象流的答案。然后,您可以使用这些流通过网络进行传输。那你就不用再处理整数了!
答案 3 :(得分:0)
Different overloads,您正在寻找:
qint64 QIODevice::write ( const char * data, qint64 maxSize );
和
qint64 QIODevice::write ( const QByteArray & byteArray );