【问题标题】:How to send integers over QTcpSocket?如何通过 QTcpSocket 发送整数?
【发布时间】:2011-10-28 05:09:59
【问题描述】:

我是 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 发送结构或联合?

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

编辑

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

【问题讨论】:

  • 仅仅说服务器需要一个整数是不够的。服务器期待一系列代表整数的字节。该整数是如何编码(什么进入字节),字节数和字节的顺序是你需要知道的并与任何其他协议特定字节(如果有)一起发送。

标签: qt sockets integer send qtcpsocket


【解决方案1】:

您遇到的问题与 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,这将失败。

【讨论】:

  • 我已经知道了TCP地址、端口号等问题。问题与Qt有关,因为如果我在unix中使用sys/socket.h提供的socket实现(例如),我可以发送结构,整数,任何我喜欢的东西。我只想知道我是否可以在这里做到这一点 - 即发送整数。与字节顺序或协议栈无关...
  • 我认为我或你的一方有一些误解:你的意思是 sys/socket.h 中的哪个函数?
  • 如果使用gcc提供的标准socket,可以直接写入sockfd,使用write()。 [见这里][linuxhowtos.org/C_C++/socket.htm]。刚刚发现我可以用 qtcpsocket write() 做同样的事情
  • 是的,这对我有帮助!谢谢!
【解决方案2】:

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

所以如下:

qint32 myData = 1;
QDataStream os( &mySocket );
os << myData;

【讨论】:

    【解决方案3】:

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

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

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

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

    【讨论】:

    • 谢谢!我将尝试使用数据流发送数据,尽管我不确定服务器是否能正确看到。会回帖。
    • 不,看起来我需要发送整数本身,然后是其他内容,或者包含整数和其他内容的结构......
    • 您确定 QDataStream 不起作用吗?请参阅此示例:doc.qt.nokia.com/latest/network-fortuneclient.html
    • 这就是我试图效仿的例子。可能是我做错了,但服务器没有正确看到它。我知道服务器没有很好地编程(它很旧),但不幸的是它不在我的手中..
    • 我明白了。这在问题的原始版本中并不清楚。然后服务器期望的不是网络透明字节顺序而是机器字节顺序的数字。太糟糕了。为了安全起见,您应该通过显式转换为该机器的字节顺序来关心字节顺序..
    【解决方案4】:

    Different overloads,您正在寻找:

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

    qint64 QIODevice::write ( const QByteArray & byteArray );
    

    【讨论】:

    • 我知道这两个重载。我只是想知道是否也有某种方法可以发送整数。不过谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-08-19
    • 2013-02-21
    • 2012-11-27
    • 2017-02-03
    • 1970-01-01
    • 2018-03-08
    • 1970-01-01
    相关资源
    最近更新 更多