Все доброе утро! Недавно переписал свое приложение с pyqt4 на C++/Qt5. В своем приложении как и раньше использую унаследованный класс от QTcpSocket. Вот пример функции приема:
void TcpSocket :: slotRecvData() {
QString buf;
QMap<QString, QVariant> map;
QJsonDocument doc;
log -> set_param("SESSION", "Server");
while(this -> bytesAvailable())
try {
buf = this -> readAll();
if(!data.isEmpty()) {
data += buf;
}
else {
parseHeader(buf);
}
while(true) {
if(data.size() < totalSize) {
break;
}
else if(data.size() > totalSize) {
doc = QJsonDocument::fromJson(data.left(totalSize).toLocal8Bit().data());
log -> debug() << totalSize << "|" << doc.toJson().data() << '\n';
map = doc.toVariant().toMap();
emit dataReceived(map);
data = data.mid(totalSize);
parseHeader(data);
}
else {
doc = QJsonDocument::fromJson(data.toLocal8Bit().data());
log -> debug() << totalSize << "|" << doc.toJson().data() << '\n';
map = doc.toVariant().toMap();
emit dataReceived(map);
data.clear();
totalSize = 0;
break;
}
}
}
catch (NetworkHeaderException &s) {
log -> error() << "Error while recv cmd: " << s.what() << '\n';
log -> error() << "Ошибка данных сети: " << buf.toStdString() << "\n";
data.clear();
totalSize = 0;
setSocketError(QAbstractSocket::ProxyConnectionRefusedError);
disconnectFromHost();
break;
}
}
void TcpSocket :: parseHeader(QString &buf) {
int index = buf.indexOf('|');
if(index == -1) {
throw NetworkHeaderException();
}
bool res;
totalSize = buf.left(index).toInt(&res);
if(!res) {
throw NetworkHeaderException();
}
data = buf.mid(index + 1);
}
На питоне эта функция имеет такой же вид, но только синтаксис другой (Я это функцию просто переписал на плюсы). Проблема в следующем. Когда начали деплоить приложение, выяснилось, что у многих наших клиентов включен прозрачный прокси. Наше приложение работает по портам 80, 8080 и 443. Так вот, приложение подключается нормально, далее следует выдача первой команды, а в ответ прилетает http ответ 404. Но у нас свой протокол (не http - <size>|<payload>). Из-за этого приложение не может нормально работать. Если запускать тоже самое, но написанное на питоне, то приложение работает как надо...Совсем не понимаю в чем дело