Необходимо написать серверное приложение, которое принимало бы команды от другого приложения, после некоторых действий возвращало бы ему ответ.
Сервер написал. Также для теста написал клиента. Оба на Qt. Реализации сетевого взаимодействия брал из учебников. А в итоге вышло так, что мой сервер не может принять команды от клиента, написанного на C# (это приложение написано другим человеком, мы с ним в паре работаем). В ходе выяснения причин неработоспособности схемы был сделан следующий вывод: проблема в моем приложении, поскольку приложение партнера способно взаимодействовать с telnet'ом, а мое нет. То есть мое приложение не универсально и работает только для приложения, которое использует QDataStream для передачи данных.
В моем коде потенциально есть "2 слабых звена":
1. Метод отправки данных клиенту.
void ServerSocket::sendToClient(QTcpSocket* pSocket, const QString str)
{
QByteArray arrBlock;
QDataStream out(&arrBlock, QIODevice::WriteOnly);
out.setVersion(QDataStream::Qt_4_7);
out << quint16(0);
out << QTime::currentTime();
out << str;
out.device()->seek(0);
out << quint16(arrBlock.size() - sizeof(quint16));
pSocket->write(arrBlock);
}
При отправке таким образом данных клиенту в начале строки появлялся мусор (размер массива QDataStream там забит). Метод был переделан:
void ServerSocket::sendToClient(QTcpSocket* pSocket, const QString str)
{
QByteArray arrBlock;
QDataStream out(&arrBlock, QIODevice::WriteOnly);
out.setVersion(QDataStream::Qt_4_7);
QByteArray ba_temp = str.toUtf8(); // переводим QString
char *str2 = ba_temp.data(); // в char
out.writeRawData(str2, strlen(str2));
pSocket->write(arrBlock);
}
Теперь отправка данных клиенту происходит нормально (по крайней мере telnet их получает в нужном виде).
2. Метод приема данных от клиента. Здесь у меня ступор.
void ServerSocket::slotReadClient()
{
clientSocket = (QTcpSocket*)sender();
QDataStream in(clientSocket);
in.setVersion(QDataStream::Qt_4_7);
for (;;)
{
if (nextBlockSize==0)
{
if (clientSocket->bytesAvailable() < sizeof(quint16))
return;
in >> nextBlockSize;
}
if (clientSocket->bytesAvailable() < nextBlockSize)
return;
QTime time;
QString str;
in >> time >> str;
str += "\r";
QByteArray ba = str.toUtf8(); // переводим QString
char *str2 = ba.data(); // в char
nextBlockSize=0;
connect(temp_com->port, SIGNAL(readyRead()), this, SLOT(slotReadCom()));
temp_com->writeToPort(str2);
}
}
Если сервер взаимодействует с клиентом на Qt, то срабатывает ветка
if (nextBlockSize==0)
{
if (clientSocket->bytesAvailable() < sizeof(quint16))
return;
in >> nextBlockSize;
}
А вот в случае с telnet nextBlockSize всегда равен 65531. И никаких данных сервером не принимается. Что мне сделать для исправления ситуации?