Показать сообщение отдельно

Micro Web Server DLL
  #82  
Старый 07.12.2009, 14:28
slesh
Познавший АНТИЧАТ
Регистрация: 05.03.2007
Сообщений: 1,985
Провел на форуме:
3288241

Репутация: 3349


Отправить сообщение для slesh с помощью ICQ
По умолчанию Micro Web Server DLL

Micro Web Server DLL

Что это и для чего это?
1) Это небольшой веб сервер реализованный в виде DLL
2) Может использовать как добавочная нагрузка на разного рода программы, где необходим свой простенький веб сервер, преимущественно для скачевание файлов. А также можно сделать его полезной нагрузкой шпионских программ или других ползучих гадов )

Характеристики:
1) чистый размер DLL - 4608
2) язык программирования - С++
3) среда разработки - MS Visual Studio 2008 Pro
4) 2 функции - остановка сервера и запуск сервера
5) Поддерживаемые ОС - Windows 98SE - Windows 7
6) Возможность использования в любых программах на любых языках (ASM, Delphi, C, C++, VB и другие компилируемые языки)
7) Сокетная система - WinSock2
8) зависимость от DLL - WS2_32.DLL, KERNEL32.DLL, USER32.DLL. Другими словами - всё стандартное, всё системное.

Возможности:
1) неограниченное кол-во работающих параллельно серверов (сколько система позволит)
2) Запуск и остановка любого сервера в любое время
3) задание порта для сервера
4) задание таймаута на получение команды от клиента
5) установка своей корневой диры для каждого сервера
6) задание максимального кол-ва пользователей одновременно обрабатываемых сервером.
7) установку размера буфера при отдаче файлов. (но не менее 1024 байт)
8) максимальный поддерживаемый размер файла - сколько позволит винда. Теоретически должно работать с файлами > 4 гигов
9) показ содержимого папки
10) поддержка русскоязычных названий папок и файлов. Теоретически вообще любые кодировки должны пахать, потому что используется widechar.

Чего не умеет:
1) никакие запросы кроме GET не поддерживаются
2) нет поддержки докачки файлов.
3) нет поддержки файлов размером больше 2 гигов.
4) никакие php, perl и прочие cgi не поддерживаются
5) сервер настроен так, что все файлы он отдает на скачевание а не на показ. т.е. я поставил application/octet-stream для всех типов файлов. Но по желанию каждый может изменить.

Функции DLL
function StartServer(var id : dword; ip : dword; port : word; MaxClients : integer; TimeOut : dword; BufSize : dword; MainDir : pwidechar):dword;

Функция возвращает результат запуска сервера. Константы описаны ниже.
Параметры:
id - в переменную будет записан дескриптор сервера
ip - сетевой интерфейс на котором будет слушаться порт. 0 - на всех.
port - порт для сервера
MaxClients - макс число одновременно подсоединенных клиентов к данному серверу
TimeOut - таймаут на получение команды от клиента в миллисекундах. т.е. 1000 = 1 сек
BufSize - размер буфера при передаче файлов
MainDir - корневая папка сервера

function StopServer(id : dword) : dword; - остановка сервера.
id - дескриптор сервера

Пример использование в Delphi
Разместить DLL в папке с программой.
Код:
const // коды ошибок
  SERVER_STATUS_OK                  = $FFFFFFF0;
  SERVER_STATUS_FOLDER_ERROR        = $FFFFFFF1;
  SERVER_STATUS_CREATE_SOCKET_ERROR = $FFFFFFF2;
  SERVER_STATUS_BIND_ERROR          = $FFFFFFF3;
  SERVER_STATUS_LISTEN_ERROR		  	= $FFFFFFF4;
  SERVER_STATUS_ALLOC_MEM_ERROR		  = $FFFFFFF5;
  SERVER_STATUS_CREATE_THREAD_ERROR	= $FFFFFFF6;
  SERVER_STATUS_ID_ERROR				    = $FFFFFFF7;
// остановка сервера
  function StopServer(id : dword) : dword; stdcall; external 'WebServ.dll';

// запуск сервера
  function StartServer(var id : dword; ip : dword; port : word; MaxClients : integer; TimeOut : dword; BufSize : dword; MainDir : pwidechar):dword; stdcall; external 'WebServ.dll';

var
  Server_1 : dword; 
  Server_2 : dword;

procedure TForm1.Button1Click(Sender: TObject);
var
  status : dword;
begin
  // запустить сервер.
  status := StartServer(Server_1, 0, 666, 10, 30000, 4096, 'c:\');
  if status <> SERVER_STATUS_OK then
  begin
    ShowMessage('Server 1 Start Error. Code = ' + inttohex(status, 8));
  end;

  status := StartServer(Server_2, 0, 667, 10, 30000, 4096, 'd:\');
  if status <> SERVER_STATUS_OK then
  begin
    ShowMessage('Server 2 Start Error. Code = ' + inttohex(status, 8));
  end;

end;

// остановка
procedure TForm1.Button2Click(Sender: TObject);
var
  status : dword;
begin
  status := StopServer(Server_1);
  if status <> SERVER_STATUS_OK then
  begin
    ShowMessage('Server 1 Stop Error. Code = ' + inttohex(status, 8));
  end;

  status := StopServer(Server_2);
  if status <> SERVER_STATUS_OK then
  begin
    ShowMessage('Server 2 Stop Error. Code = ' + inttohex(status, 8));
  end;
end;
Пример использование в С++
Для С++ по подобной системе.
Код:
#define SERVER_STATUS_OK					0xFFFFFFF0
#define SERVER_STATUS_FOLDER_ERROR			0xFFFFFFF1
#define SERVER_STATUS_CREATE_SOCKET_ERROR	0xFFFFFFF2
#define SERVER_STATUS_BIND_ERROR			0xFFFFFFF3
#define SERVER_STATUS_LISTEN_ERROR			0xFFFFFFF4
#define SERVER_STATUS_ALLOC_MEM_ERROR		0xFFFFFFF5
#define SERVER_STATUS_CREATE_THREAD_ERROR	0xFFFFFFF6
#define SERVER_STATUS_ID_ERROR				0xFFFFFFF7

ULONG __stdcall StartServer(ULONG* id, ULONG ip, USHORT port, LONG MaxClients, ULONG TimeOut, ULONG BufSize, wchar_t * MainDir)
ULONG __stdcall StopServer(ULONG id)
.....................
 ULONG Server;
 
 StartServer(&Server_1, 0, 666, 10, 30000, 4096, L"c:\\");
.......................
На последок
Если компилить как exe то размер будет 3,5 кила.
В принципе работает норм. Покрайней мере при тестировании. Кто пробовал, отпишите.

В архиве вы найдете файлы:
WebServ.cpp - исходник DLL
WebServ.def - вспомогательный файл
WebServ.dll - откомпиленная DLL
WebServ.h - хидер
WebServ.vcproj - файл проекта

http://slesh.name/uploads/WebServ.rar

(С) SLESH 2009 )
 
Ответить с цитированием