Да, между Windows и Linux с CR LF есть некоторые различия, это "нормально".
Один из подходящих подходов - использовать буфер, а затем ждать готовности данных или тайм-аута.,Например, ваш токен-разделитель может быть «\ r», и если после его удаления вы получите «\ n».
Вот пример, ожидающий токен от пользовательского протокола :
int Connection::readDataIntoBuffer(int maxSize)
{
if (maxSize > MaxBufferSize)
return 0;
int numBytesBeforeRead = buffer.size();
if (numBytesBeforeRead == MaxBufferSize) {
abort();
return 0;
}
while (bytesAvailable() > 0 && buffer.size() < maxSize) {
buffer.append(read(1));
if (buffer.endsWith(SeparatorToken))
break;
}
return buffer.size() - numBytesBeforeRead;
}
См. http://doc.qt.nokia.com/stable/network-network-chat-connection-cpp.html
В зависимости от того, что вам нужно, другое предложение - попробовать придерживаться какого-то стандартного протокола .Таким образом, вы можете тестировать с различными типами клиентов.
Если вы хотите придерживаться своего собственного протокола, я предлагаю вам написать свой собственный клиент и написать надлежащие тестовые случаи для совместной работы с вашим сервером.Qt делает это легко и быстро;) Посмотрите на примеры сети.
Edit:
Вы можете рассмотреть readline()
вместо read()
на вашем QTcpSocket
, что является QIODevice
.Он ожидает новой строки вместо read () (см. Выдержку из документа ниже).Однако это дает меньше контроля над окончанием вашей строки:
qint64 QIODevice::readLine ( char * data, qint64 maxSize )
Из документа:
Данные считываются до тех пор, пока не будет выполнено любое из следующих условий:
- Первый символ '\ n' читается.
- maxSize - считывается 1 байт.
- Обнаружен конец данных устройства.
Секретным компонентом в Qt является асинхронныйуправляемый сигналом дизайн .См. Раздел «Сеть / конечные автоматы» в статье Потоки, события и объекты QObjects для некоторых идей.