Проблема между QTcpServer и TCPClientSocket (Cayuga) - PullRequest
1 голос
/ 12 октября 2009

Я пытаюсь установить связь через сокет TCP между приложением QT4 (MyApp) и Cayuga (написано на C ++).

Часть соединения работает нормально, т.е. Cayuga подключается к MyApp.

Теперь MyApp отправляет некоторые данные на Cayuga, но ничего не получается.

void MyApp :: init ()

QTcpServer *m_server;
QTcpSocket *clientConnection;
//Open socket for transmission
m_server = new QTcpServer(this);
if (!m_server->listen(QHostAddress::Any, m_port)) {
//Error handling
  return;
}
connect(m_server, SIGNAL(newConnection()), this, SLOT(startSend()));

void MyApp :: startSend ()

{
    clientConnection = m_server->nextPendingConnection();
}

Запись здесь делается:

QByteArray block;
QDataStream out(&block, QIODevice::WriteOnly);
out.setVersion(QDataStream::Qt_4_0);
out << (quint16)0;
out << s;
out.device()->seek(0);
out << (quint16)(block.size() - sizeof(quint16));
clientConnection->write(block);
clientConnection->flush();

Мой преподаватель предложил использовать внешнюю библиотеку (cudb), если я не могу заставить ее работать с QTcpSockets. Это не правильно, и поэтому я надеюсь, что у вас есть лучший ответ на мою проблему.

1 Ответ

1 голос
/ 15 ноября 2009

Это мое предположение о том, что происходит:

QDataStream реализует протокол сериализации (следовательно, для него требуется указать версию (Qt_4_0)). На другом конце вам нужно что-то, что понимает этот протокол (то есть, другой Qt_4_0 DataStream). В частности, QDataStream гарантирует, что вы получите правильные данные независимо от порядкового номера отправляющего и получающего концов.

Вместо сериализации в блок и последующей записи блока вы можете попробовать что-то вроде:

QDataStream out(clientConnection, QIODevice::WriteOnly);
out.setVersion(QDataStream::Qt_4_0);
out.writeRawData(data, length);
clienConnection->flush();

writeRawData () не выполняет маршалинг ваших данных ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...