ANTICHAT.XYZ    VIDEO.ANTICHAT.XYZ    НОВЫЕ СООБЩЕНИЯ    ФОРУМ  
Баннер 1   Баннер 2
Antichat снова доступен.
Форум Antichat (Античат) возвращается и снова открыт для пользователей. Здесь обсуждаются безопасность, программирование, технологии и многое другое. Сообщество снова собирается вместе.
Новый адрес: forum.antichat.xyz
Вернуться   Форум АНТИЧАТ > Программирование > С/С++, C#, Delphi, .NET, Asm
   
Ответ
 
Опции темы Поиск в этой теме Опции просмотра

[c++] Класс Веб-сервер
  #1  
Старый 28.06.2007, 15:36
Аватар для ZaCo
ZaCo
Banned
Регистрация: 20.06.2005
Сообщений: 880
Провел на форуме:
4610226

Репутация: 1332


По умолчанию [c++] Класс Веб-сервер

Вчера возникла задача обслуживания своего приложения через веб, но чтобы не возиться с локализацией я решил написать более-менее универсальный класс на си++ для решения этой задачи. Класс представляет собой набор методов для воссоздания модели настоящего веб-сервера, тут конечно ни о каком соответствии с rfc и речи быть не может, однако для получения и соответствующей обработки переменных передаваемых в get\post\cookie его в общем-то хватает.
Пример программы, которая складывает два числа и выводит ip-адрес пользователя на странице:
Код:
#include <winsock2.h>
#include <string>

#include "swebs.hpp"
namespace std
{

typedef map <string, string> var_map;
void func(int,var_map *,p_selfOut);

void func(int id,var_map * vars,p_selfOut outF)
 {
  string out_s;

  out_s="HTTP/1.1 200 OK\n";
  out_s+="Connection: close\n";
  out_s+="Content-Type: text/html\n\n";
  outF(id, out_s.c_str(), out_s.length());


  var_map & Vars=*vars;

  string data1=Vars["a"],data2=Vars["b"];
  
  if(data1.empty()||data2.empty())//form
   {
    out_s="Welcome: "+Vars["REMOTE_ADDR"]+"<br>\n";
    outF(id, out_s.c_str(), out_s.length());
    
    out_s="<html> <head>  <title>WebS test</title> </head> <form method=post>  <input type=text name=a>  <input type=text name=b>  <input type=submit> </form></html>";
    outF(id, out_s.c_str(), out_s.length());
   }
  else
   {
    char out_s[256];
    strcpy(out_s,"<b>sum is: </b>");
    sprintf(&out_s[strlen(out_s)],"%d",atoi(data1.c_str())+atoi(data2.c_str()));
    outF(id, out_s, strlen(out_s));
   }

  delete vars; 
 }

int main(int argc, char * argv[])
 {
  WSADATA WSA;
  if(WSAStartup(MAKEWORD(2,2), &WSA) != 0) return 0;
  //
  cWebs server(func, 6669);
  bool ok=server.Bind();
  if(ok) server.Listen();
   else puts("binding error");
  return 0;
 }
}
Сначала идет описание прототипа пользовательской функции:
Код:
void func(int id,var_map * vars,p_selfOut outF)
Ее задача состоит как раз-таки в обработке переданных переменных и выводе соответствующей странички в качестве ответа. Передав конструктору адрес функции, при каждом новом запросе к веб-серверу, объект класса cWebs сам вызовет функцию и указатель на обьект типа карта (map), (предоставляя тем самым удобный пхп-подобный доступ к переменным), адрес-функцию Out и некоторое int значение id, которое функция сама должна передать в Out для вывода данных в ответ на исходный хттп-запрос. Прототип функции Out:

Код:
void Out(int ,const char *, int);
Второй аргумент представляет собой строку-указатель, третий длину строки.

Несмотря на то, что класс обеспечивает лишь элементарные возможности http-запроса, он в то же время предоставляет и простую их обработку пользовательской функцией. Все переданные переменные сохраняются в карте *vars при этом метод которым они передавались не учитывается. Одновременно через *vars имеется доступ к переменным окружения: REMOTE_ADDR (ИП пользователя) и GET_FILE (запрашиваемый файл в запросе).

ps иерархия переменных: get, cookie, post. то есть, значение get-переменной 'a', перепишется значением post-переменной 'a', если таковая имеется.



Исходники: http://zaco.itdefence.ru/webs/

Последний раз редактировалось ZaCo; 02.09.2007 в 21:27..
 
Ответить с цитированием

  #2  
Старый 28.06.2007, 17:29
Аватар для Pochka
Pochka
Познающий
Регистрация: 26.11.2005
Сообщений: 32
Провел на форуме:
47872

Репутация: 20
По умолчанию

Цитата:
WSAStartup(MAKEWORD(2,2), &WSA)
откуда скопипастил?
 
Ответить с цитированием

  #3  
Старый 28.06.2007, 18:36
Аватар для ZaCo
ZaCo
Banned
Регистрация: 20.06.2005
Сообщений: 880
Провел на форуме:
4610226

Репутация: 1332


По умолчанию

не помню,

зы вообще говоря, в пользовательской функции отправлять ответ можно напрямую - писать по дексриптору id
 
Ответить с цитированием
Ответ



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Веб 2.0 и Веб 3.0. Будущее Интернета. SK | Heaton Мировые новости 5 13.06.2007 02:07
Простой веб шел на Jsp ~Hidrag~ Авторские статьи 2 25.05.2007 06:39
Обзор протокола Http bxN5 Чужие Статьи 2 13.03.2007 01:11
Карманный веб сервер с поддержкой Php для наладонников Noman Схемы и программы 2 21.12.2006 23:51
Общие сведения о Ftp уязвимостях. ReVOLVeR Чужие Статьи 0 15.09.2006 19:27



Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
 


Быстрый переход




ANTICHAT.XYZ