Russian Qt Forum
Ноябрь 26, 2024, 17:47 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Проблема с реализацией некоторых фрагментов для сервера  (Прочитано 2427 раз)
raaawr
Гость
« : Октябрь 22, 2013, 19:38 »

Простите пожалуйста за некорректную информацию в прошлой теме.
Вообщем этот же сервер, на стр. браузера по адресу localhost он выводит дату.
Задание заключается в том, что при изменении адреса, например на: localhost/asdf он должен ввести ошибку,аналогичную ошибке 404,
в моем случае он выводит код ошибки "203"
заголовок(qsimpleserver.h)
Код
C++ (Qt)
#ifndef QSIMPLESERVER_H
#define QSIMPLESERVER_H
 
#include <QTcpServer>
#include <QTcpSocket>
#include <QDebug>
#include <QDateTime>
 
 
class QSimpleServer : public QTcpServer
{
   Q_OBJECT
public:
   explicit QSimpleServer(QObject *parent = 0);
 
   explicit CEditLineButton(QWidget *parent = 0);
       ~CEditLineButton ();
       void setTextToEditLine (QString text);
 
   void incomingConnection(int handle);
signals:
   void clickButton ();
 
public slots:
   void onReadyRead();
   void onDisconnected();
 
};
 
#endif // QSIMPLESERVER_H
 
 

исходник1 (qsimpleserver.cpp)
Код
C++ (Qt)
#include "qsimpleserver.h"
 
 
 
QSimpleServer::QSimpleServer(QObject *parent) :
   QTcpServer(parent)
{
   if(listen(QHostAddress::Any, 80)){
       qDebug() << "Listening...";
   }
   else{
       qDebug() << "Error while starting: " << errorString();
   }
}
 
void QSimpleServer::incomingConnection(int handle)
{
   QTcpSocket* socket = new QTcpSocket();
   socket->setSocketDescriptor(handle);  
 
   connect(socket, SIGNAL(readyRead()), this, SLOT(onReadyRead()));
   connect(socket, SIGNAL(disconnected()), this, SLOT(onDisconnected()));
 
}
void QSimpleServer::onReadyRead()
{
   QTcpSocket* socket = qobject_cast<QTcpSocket*>(sender());
   qDebug() << socket->readAll();
 
   QString response = "HTTP/1.1 200 OK\r\n\r\n%1";
   socket->write(response.arg(QTime::currentTime().toString()).toLocal8Bit());
   socket->disconnectFromHost();
}
 
void QSimpleServer::onDisconnected()
{
   QTcpSocket* socket = qobject_cast<QTcpSocket*>(sender());
   socket->close(); /
   socket->deleteLater();  
}
 
 

исходник2(tst_simpleservertest.cpp)
Код
C++ (Qt)
#include <QtCore/QCoreApplication>
 
#include "qsimpleserver.h"
 
 
int main(int argc, char *argv[])
{
   QCoreApplication a(argc,argv);
   QSimpleServer server;
   return a.exec();
 
 
}
 
 

в про файле отличие от стандарта только:
Код
C++ (Qt)
QT       += testlib network
 

вообщем попытался сделать так:

Код
C++ (Qt)
if((QHostAddress::LocalHost) == (QHostAddress::LocalHost))
{
socket->write(response.arg(QNetworkReply::ContentNotFoundError).toUtf8());
socket->disconnectFromHost();
}
 
else
{
socket->write(response.arg(QDateTime::currentDateTime().toString()).toUtf8());
 
socket->disconnectFromHost();
}
 

Но вывод на странице localhost и к примеру localhost/afag лишь код ошибки, а хотелось бы чтоб на localhost был код ошибки, а на другом собственно дата.
Надеюсь кто-нибудь меня поймет):
Записан
VPS
Гость
« Ответ #1 : Октябрь 22, 2013, 21:48 »

Если я правильно понял, то Вам надо сделать парсер строки запроса от браузера. И, если запрос (GET) на правильный url (в вашем случае на '/'), то отправляете ему время и код 200, а если запрос на "левый" url, то код ответа 404...
Записан
raaawr
Гость
« Ответ #2 : Октябрь 22, 2013, 21:53 »

Если я правильно понял, то Вам надо сделать парсер строки запроса от браузера. И, если запрос (GET) на правильный url (в вашем случае на '/'), то отправляете ему время и код 200, а если запрос на "левый" url, то код ответа 404...

правильно поняли,спасибо, попробую)
Записан
raaawr
Гость
« Ответ #3 : Октябрь 22, 2013, 22:23 »

Если я правильно понял, то Вам надо сделать парсер строки запроса от браузера. И, если запрос (GET) на правильный url (в вашем случае на '/'), то отправляете ему время и код 200, а если запрос на "левый" url, то код ответа 404...

только я понятия не имею как сделать парсер строки:D
Записан
VPS
Гость
« Ответ #4 : Октябрь 24, 2013, 21:43 »

только я понятия не имею как сделать парсер строки:D

Ели по простому, то можно как-то так (псевдокод):

1. Преобразовать запрос, считанный из сокета, в строку.
2. Разбить эту строку на подстроки и поместить их в список QStringList (разбить по "\r\n\r\n").
3. Создать регулярное выражение поиска подстроки, где содержится "GET (path) HTTP..."
4. В цикле пройтись по списку и если найдено совпадение, то вернуть строку с путём, который вернёт регулярное выражение.
5. В зависимости от пути, который вернётся в п.4 сформировать и отправить нужный ответ в сокет.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.365 секунд. Запросов: 20.