Библиотека для создания сетевых приложений (асинхронная + мн
От: _facelift  
Дата: 12.11.15 07:57
Оценка:
Здравствуйте, abrec, Вы писали:

A>Привет!

A>Зачем ОНО????

Быстро написать сервер. Из примера:

1) Наследуем наш сервер от базового класса

class HttpServer: public doronix::TcpServer
{
public:
      HttpServer(const std::string &documentRoot, bool useAsyncFiles, int bufferSize, int threadCount = 0);
      doronix::Client *createClient(doronix::TcpSocket *socket) override;
private:
      std::string _documentRoot;
      bool _useAsyncFiles;
};


2) Переопределяем функцию createClient, где мы вернем нашего клиента отнаследанного от базового класса.
Каждый раз когда пришло подключение — вызывается эта функция

#include "httpserver.h"
#include "httpclient.h"

HttpServer::HttpServer(const std::string &documentRoot, bool useAsyncFiles, int bufferSize, int threadCount)
      : doronix::TcpServer(doronix::READING_FROM_STATE, bufferSize, threadCount)
      , _documentRoot(documentRoot)
      , _useAsyncFiles(useAsyncFiles)
{
}

doronix::Client *HttpServer::createClient(doronix::TcpSocket *socket)
{
      HttpClient *client = new HttpClient();

      client->setDocumentRoot(_documentRoot);
      client->setUseAsyncFiles(_useAsyncFiles);

      return client;

}


3) Пишем клиента. Надо отнаследовать наш клиент от класса doronix::Client и переопределить 2 метода — readFromClient, writeToClient
Когда мы читаем и приходят данные — вызывается readFromClient, а когда мы перевели клиента в пишущий режим вызвав setWriting,
вызывается writeToClient чтобы послать данные клиенту.

Начальный стейт (читаем или пишем) вы выставляем в сервере. Меняем методами setReading/setWriting. Возможно поставить чтение
на паузу вызвав suspendWriting/resumeWriting.

В папке examples есть 2 примера — http сервер и чат. Библиотека асинхронная, многопоточная с поддержкой SSL, и возможностью асинхронно/синхронно послать файл.
Все очень быстро.

class HttpClient: public doronix::Client
{
public:
      HttpClient();
      ~HttpClient();

      int readFromClient(const char *buffer, int size) override;
      int writeToClient(char *buffer, int size) override;
 
      void setDocumentRoot(const std::string &documentRoot);
      void setUseAsyncFiles(bool useAsyncFiles);

private:
      bool _headerSent = false;

      doronix::File *_file = 0;
      std::string _buffer;

      std::string _documentRoot;
      bool _useAsyncFiles = true;
};
Отредактировано 12.11.2015 8:00 Николай Ивлев . Предыдущая версия .
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.