LINUX.ORG.RU

Сообщения hellomyfriend

 

проблема с qsslsocket

Форум — Development

Здравствуйте, у меня возникла проблема с QSslSocket. Клиенту удается подключиться, но отправлять сообщение клиенту удается только до строчки sslSocket->startServerEncryption(); Ниже представлен код сервера:

#include "qsslserverclass.h"
#include <QDebug>
QSSLServerClass::QSSLServerClass(int portServ, QObject *parent)
        : QTcpServer(parent)
{
    portServer = portServ;
}
 
bool QSSLServerClass::startServer()
{
    if(!listen(QHostAddress::Any,portServer)){
        qDebug()<<"error";
        close();
        return false;
    } else{
        return true;
    }
}
 
void QSSLServerClass::incomingConnection(qintptr handle)
{
    qDebug()<<"incomingConnection on socket:"<< handle;
    emit(signalNewConnection(handle));
   // new QSSLServerConnectionClass(handle, this);
     servclass = new QSSLServerConnectionClass(handle,this);
}
 
void QSSLServerClass::slotSendMes(QString str)
{
    qDebug()<<"2"<<str;
    servclass->SendMes(str);
}
 
QSSLServerConnectionClass::QSSLServerConnectionClass(quint16 socketNum, QObject *parent)
    : QObject(parent)
{
   sslSocket = new QSslSocket(this);
   sslSocket->setSocketDescriptor(socketNum);
 
   QFile certFile(QStringLiteral(":/certificate.pem"));//Написать свои?
   QFile keyFile(QStringLiteral(":/private.key"));// Или оставить эти? Или заказать на сайте бесплатные?
   certFile.open(QIODevice::ReadOnly);
   keyFile.open(QIODevice::ReadOnly);
   sslCertificate = new QSslCertificate(&certFile);
   sslKey = new QSslKey(&keyFile,QSsl::Rsa);
   certFile.close();
   keyFile.close();
 
   sslSocket->setLocalCertificate(*sslCertificate);
   sslSocket->setPrivateKey(*sslKey);
   sslSocket->setProtocol(QSsl::AnyProtocol);
 
   connect(sslSocket,SIGNAL(connected()),this,SLOT(slotConnected()));
   connect(sslSocket,SIGNAL(encrypted()),this,SLOT(slotReadyRead()));
   connect(sslSocket,SIGNAL(disconnected()),this,SLOT(slotDisconnected()));
   connect(sslSocket,SIGNAL(error(QAbstractSocket::SocketError)),this,SLOT(slotSSLErrors(QAbstractSocket::SocketError)));
/////Отправляет
QByteArray array;
  QString str = "[server]>> Hello my friend\n";
   array.append(str);
   sslSocket->write(array);
 
   sslSocket->startServerEncryption();
 
/////уже не отправляет
QByteArray array;
  QString str = "[server]>> Hello my friend\n";
   array.append(str);
   sslSocket->write(array);
}
В чем может быть проблема? Хочется узнать ваше мнение и советы, спасибо))

 , , ,

hellomyfriend
()

Как получить заголовки https страниц с помощью QNetworkAccessManager

Форум — Development

Программа работает так: Когда в браузере заходим на какой либо сайт, используется прокси и подключается к моему серверу (qtcpserver). Далее сервер получает некие данные сайта на который пытаемся зайти. После получения информации необходимо чтобы мой сервер вернул какую-то инфу обратно браузеру, чтобы браузер отобразил загруженную страницу сайта. Т.е.

Загрузка какой-либо страницы в браузере -> отправка заголовка ответа на мой сервер -> отправка запроса сервером на сайт -> получение ответа от сайта -> отправка данных полученных от сайта обратно в браузер. И вот здесь существует две проблемы. Первая: При получении доступа к сайту http мне удается получить и заголовок моего запроса (GET ...) и заголовок ответа сайта. Но при попытке подключиться к https мой запрос на сайт выглядит примерно так:

CONNECT e.mail.ru:443 HTTP/1.1
User-Agent: Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:63.0) Gecko/20100101 Firefox/63.0
Proxy-Connection: keep-alive
Connection: keep-alive
Host: e.mail.ru:443
Так вот каким образом я могу добиться, чтобы мне выдавало GET запрос для https сайтов, а не CONNECT? Запрос получаю таким образом:
QTcpSocket* clientSocket = (QTcpSocket*)sender();
    socket_ = (QTcpSocket*)sender();
    QString str;
    str = clientSocket->readAll();
Ответ таким образом:
//Функция отправки запроса сайту
void QTCPServerClass::funcSiteRequest(QString str)
{
    QNetworkRequest request(str);
    QNetworkReply* reply=  manager->get(request);
connect(reply,SIGNAL(finished()),this,SLOT(replyFinished()));
}

//Слот получения заголовков ответа
void QTCPServerClass::replyFinished()
{
        QList<QByteArray> list; QString str;
        QNetworkReply *reply= qobject_cast<QNetworkReply *>(sender());
        if (reply->error() == QNetworkReply::NoError){
            list.append(reply->rawHeaderList());
            foreach(QByteArray head, list) {
                str = str + head +":" + reply->rawHeader(head) + "\r\n";
            }
           
        } else{
           // qDebug()<<reply->errorString();
        }
    } 
}
Теперь вторая проблема. Необходимо полученный код страницы вернуть браузеру. Пытаюсь сделать таким образом:
QByteArray arrBlock;
     arrBlock.append(str);//полученное содержимое страницы через manager.get()
     socket_->write(arrBlock);
     socket_->disconnect();
Если я подключаюсь к сайту по типу http://www.example.com/, то проблемы нет, все без проблем возвращает браузеру. Но если я попытаюсь подключится к doc.crossplatform.ru/qt, то получу бесконечную загрузку до тех пор, пока не закрою свою программу.После закрытия программы сайт кое-как загрузится превратив русские символы в непонятный набор, а английские загрузит как нужно. Что нужно исправить, чтобы сайт загружало и без закрытия программы? А так же буду благодарен, если подскажите как решить проблему с русскими символами.

 , , ,

hellomyfriend
()

Получение текущей раскладки

Форум — Development

Привет обитателям форума. Поставленная мне задача: Нужно сделать индикатор текущей раскладки и при клике по этому индикатору вылазила менюшка, в которой можно выбрать какой-либо язык и программно его переключить на выбранный. То есть, по факту есть две задачи: 1) Получить текущий язык. 2) Программно его переключить и при этом оставить возможность переключения кнопками (например shift + alt). Теперь к проблеме. Получаю текущий язык таким образом:

XkbStateRec xkbState;
    Display *display = XOpenDisplay(NULL);
    XkbGetState(display, XkbUseCoreKbd, &xkbState);
    Atom real_prop_type; int fmt;
    unsigned long nitems, extra_bytes;
    char *prop_data = NULL;
    Atom rules_atom = XInternAtom(display, "_XKB_RULES_NAMES", False);
    XGetWindowProperty(display, DefaultRootWindow(display), rules_atom, 0L, 1024,
        False, XA_STRING, &real_prop_type, &fmt, &nitems, &extra_bytes, (unsigned char **) (void *) &prop_data);

    QStringList names;
    for(char* p=prop_data; p-prop_data < (long)nitems && p != NULL; p += strlen(p)+1) names.append( p );
    if (names.count() > 3 ) names = names[2].split(",");
    XFree(prop_data);
    XCloseDisplay(display);
    return names[xkbState.group];
Переключаю языки через setxkbmap. Косяк в том, что после переключения языка переключения «горячими клавишами» перестает работать. И остается возможность только программно менять раскладку. И наверное вы подумали, а зачем же я переключаю раскладку через setxkbmap? Просто способы переключения через Х11 по типу:
Display *display = XOpenDisplay(NULL);
                XkbLockGroup( display, XkbUseCoreKbd, i );
                XkbStateRec state[1];
                memset(state, 0, sizeof(state));
                XkbGetState(display, XkbUseCoreKbd, state);
отказываются корректно работать.

 , ,

hellomyfriend
()

RSS подписка на новые темы