2011-08-16 35 views
2

我是新来的Qt,所以如果这是一个完全愚蠢的问题...如何通过QTcpSocket发送整数?

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

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

编辑

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

+1

这不是真的够说,服务器期待一个整数。服务器期待一系列代表整数的字节。这个整数是如何编码的**(进入字节的内容),**字节数**和**顺序**字节是您需要知道和发送的内容以及任何其他特定协议字节,如果有的话。 –

回答

4

你有没有真正涉及到的Qt问题,同样的问题会与其他任何Socket或流媒体接口出现。

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

该编码不仅包含字节排序,而且还描​​述了如何传输复杂的结构。 后者的信息通常被编码为称为“ASN.1”的东西 - 抽象语法表示法。

如果你的服务器是很简单的,只是接受整数一个接一个,没有任何元信息并且是在同一个平台上,比你可以做这样的事情:

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

你把地址的整数作为数据缓冲区开始并传输尽可能多的字节作为您的整数。 但是请注意,如果您将数据从Intel架构传输到16位架构或摩托罗拉PPC,则会失败。

+0

我已经知道了TCP地址,端口号等等。这个问题与Qt有关,因为如果我在unix中使用由sys/socket.h提供的套接字实现(例如),我可以发送结构,整数,其他任何我喜欢。我只想知道我是否可以在这里做到这一点 - 即发送整数。与字节顺序或协议栈无关... – Sagar

+0

我认为在我或你的身边存在一些误解:sys/socket.h中的哪个函数正是你的意思? – Jens

+0

如果使用gcc提供的标准套接字,可以使用write()直接写入sockfd。 [见这里] [http://www.linuxhowtos.org/C_C++/socket.htm]。刚刚发现我可以用qtcpsocket写() – Sagar

1

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

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

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

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

+0

谢谢!我会尝试使用数据流发送数据,但我不确定服务器是否能正确看到数据。将回传。 – Sagar

+0

不,看起来我需要发送整数本身,其次是其他的东西,或者包含整数和其他东西的结构... – Sagar

+0

你确定QDataStream不起作用吗?看到这个例子:http://doc.qt.nokia.com/latest/network-fortuneclient.html – ypnos

0

Different overloads,你正在寻找:

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

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

我知道两个重载。我只是想知道是否有某种方式发送整数。虽然谢谢! – Sagar

4

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

因此,一些如下:

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