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 - файл проекта
(С) SLESH 2009 )