Как отправить целые числа через QTcpSocket? - PullRequest
2 голосов
/ 16 августа 2011

Я новичок в 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?

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

EDIT

Сервер уже принимает целые числа и ожидает целое число - я не могу это контролировать.

Ответы [ 4 ]

4 голосов
/ 17 августа 2011

Я предлагаю использовать QDataStream с сокетами.Это защитит вас от проблемы little endian / big endian .

Итак, как показано ниже:

qint32 myData = 1;
QDataStream os( &mySocket );
os << myData;
4 голосов
/ 16 августа 2011

Проблема, которая у вас есть, на самом деле не связана с Qt, такая же проблема возникнет с любым другим интерфейсом Socket или Streaming.

Поставщик Сервера должен предоставить вам описание протокола.Это описание обычно содержит используемые порты (TCP, UDP, числа), другие параметры TCP и кодирование передаваемых данных.Иногда этот протокол (или его реализация) называют стеком (protocol-).

Кодирование содержит не только порядок байтов, но и описание того, как передаются сложные структуры.Последняя информация часто кодируется во что-то, что называется «ASN.1» - абстрактная синтаксическая нотация.

В случае, если ваш сервер действительно прост и просто принимает целые числа одно за другим без какой-либо мета-информации и включенту же платформу, чем вы могли бы сделать что-то вроде этого:

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

В качестве начала буфера данных вы берете адрес своего целого числа и передаете столько байтов, сколько имеет ваше целое число.Но обратите внимание: это не удастся, если вы передадите данные из архитектуры Intel в 16-битную архитектуру или в PPC Motorola.

1 голос
/ 16 августа 2011

Когда вы пишете в строковом представлении, вы также должны интерпретировать строку на другой стороне. Например, есть QString :: toInt () .

Когда вы хотите записать целое число как целое, вы будете иметь большую пропускную способность, так как для передачи требуется меньше байтов. Однако вы должны прочитать о теме сетевой порядок байтов .

В принципе можно копировать структуры и т. Д. В буфер, а также по сети. Однако все становится сложнее, когда вы передаете данные между разными архитектурами или даже только разными сборками программного обеспечения. Таким образом, вы не должны отправлять необработанные данные, а использовать сериализацию! Смотрите этот вопрос: Сериализация с Qt

Предоставляет ответы о том, как генерировать потоки из объектов и объекты из потоков. Эти потоки используются для передачи по сети. Тогда вам больше не нужно иметь дело с самими целыми числами!

0 голосов
/ 16 августа 2011

Различные перегрузки , вы ищете:

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

и

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