самописный "веб" - сервер

Модератор: Fastman

Правила форума
Убедительная просьба юзать теги [code] при оформлении листингов.
Сообщения не оформленные должным образом имеют все шансы быть незамеченными.
ASD
мл. сержант
Сообщения: 112
Зарегистрирован: 2008-12-25 20:19:54

самописный "веб" - сервер

Непрочитанное сообщение ASD » 2009-06-02 13:38:30

Всем, хорошего настроения

Хотелось бы написать самописный "веб"-сервер.Есть опыт програмирования на С++ в видузе...поэтому не совсем все понятно *nix

1. Что можно почитать про многопоточность во FreeBSD
2. Так же хотел узнать как можно использовать CGI-программы в самописном сервере?
3. посоветуйте консольный IDE

Хостинговая компания Host-Food.ru
Хостинг HostFood.ru
 

Услуги хостинговой компании Host-Food.ru

Хостинг HostFood.ru

Тарифы на хостинг в России, от 12 рублей: https://www.host-food.ru/tariffs/hosting/
Тарифы на виртуальные сервера (VPS/VDS/KVM) в РФ, от 189 руб.: https://www.host-food.ru/tariffs/virtualny-server-vps/
Выделенные сервера, Россия, Москва, от 2000 рублей (HP Proliant G5, Intel Xeon E5430 (2.66GHz, Quad-Core, 12Mb), 8Gb RAM, 2x300Gb SAS HDD, P400i, 512Mb, BBU):
https://www.host-food.ru/tariffs/vydelennyi-server-ds/
Недорогие домены в популярных зонах: https://www.host-food.ru/domains/

zg
полковник
Сообщения: 5845
Зарегистрирован: 2007-12-07 13:51:33
Откуда: Верх-Нейвинск

Re: самописный "веб" - сервер

Непрочитанное сообщение zg » 2009-06-02 13:50:20

ASD писал(а):1. Что можно почитать про многопоточность во FreeBSD
man fork
ASD писал(а):2. Так же хотел узнать как можно использовать CGI-программы в самописном сервере?
как реализуешь сервер так и будешь использовать :pardon: это к HTTP никак не относится, насколько я знаю.
ASD писал(а):3. посоветуйте консольный IDE
многие говорят vim, насколько это правда не знаю. Некоторые сидят в mc, я сижу в ee :smile:

paradox
проходил мимо
Сообщения: 11620
Зарегистрирован: 2008-02-21 18:15:41

Re: самописный "веб" - сервер

Непрочитанное сообщение paradox » 2009-06-02 14:25:14

Хотелось бы написать самописный "веб"-сервер.Есть опыт програмирования на С++ в видузе...поэтому не совсем все понятно *nix
зачем?
1. Что можно почитать про многопоточность во FreeBSD
многопоточность на бсд это вчерашнее время
читаем о man kevent
2. Так же хотел узнать как можно использовать CGI-программы в самописном сервере?
это вопрос не к самописному серверу
а к вам
3. посоветуйте консольный IDE
vi/vim

Larin
лейтенант
Сообщения: 975
Зарегистрирован: 2008-01-29 20:08:41
Откуда: РБ, Минск

Re: самописный "веб" - сервер

Непрочитанное сообщение Larin » 2009-06-02 15:03:55


ASD
мл. сержант
Сообщения: 112
Зарегистрирован: 2008-12-25 20:19:54

Re: самописный "веб" - сервер

Непрочитанное сообщение ASD » 2009-06-24 11:02:57

zg писал(а):
ASD писал(а):1. Что можно почитать про многопоточность во FreeBSD
man fork
пошел по варианту thread
zg писал(а):
ASD писал(а):2. Так же хотел узнать как можно использовать CGI-программы в самописном сервере?
как реализуешь сервер так и будешь использовать :pardon: это к HTTP никак не относится, насколько я знаю.
блин, все равно не понятно....ладно как дойду спрошу :)
zg писал(а):
ASD писал(а):3. посоветуйте консольный IDE
многие говорят vim, насколько это правда не знаю. Некоторые сидят в mc, я сижу в ee :smile:
Пишу в MS VC2005....по фтп на фряху....сойдет на первое время

ASD
мл. сержант
Сообщения: 112
Зарегистрирован: 2008-12-25 20:19:54

Re: самописный "веб" - сервер

Непрочитанное сообщение ASD » 2009-06-24 12:20:06

paradox писал(а):
1. Что можно почитать про многопоточность во FreeBSD
многопоточность на бсд это вчерашнее время
читаем о man kevent
я так понимаю после каждого accept-а я должен вешать kevent на вновь созданный сокет?

paradox
проходил мимо
Сообщения: 11620
Зарегистрирован: 2008-02-21 18:15:41

Re: самописный "веб" - сервер

Непрочитанное сообщение paradox » 2009-06-24 12:21:53

зачем создавать сокет?
у тебя уже есть сокет который слушает
а аксепт тебе уже возращает сокет при коннекте

ASD
мл. сержант
Сообщения: 112
Зарегистрирован: 2008-12-25 20:19:54

Re: самописный "веб" - сервер

Непрочитанное сообщение ASD » 2009-06-24 12:32:53

paradox писал(а):зачем создавать сокет?
у тебя уже есть сокет который слушает
а аксепт тебе уже возращает сокет при коннекте
разве не?

ASD
мл. сержант
Сообщения: 112
Зарегистрирован: 2008-12-25 20:19:54

Re: самописный "веб" - сервер

Непрочитанное сообщение ASD » 2009-06-24 12:34:14

paradox писал(а):зачем создавать сокет?
у тебя уже есть сокет который слушает
а аксепт тебе уже возращает сокет при коннекте
Ясно, что я туплю...но честно не могу понять...т.е. один сокет для всех соединений?

paradox
проходил мимо
Сообщения: 11620
Зарегистрирован: 2008-02-21 18:15:41

Re: самописный "веб" - сервер

Непрочитанное сообщение paradox » 2009-06-24 12:36:45

почему один сокет?
один сокет слушает
а аксепт по этому сокету возращает новый сокет соединения

ASD
мл. сержант
Сообщения: 112
Зарегистрирован: 2008-12-25 20:19:54

Re: самописный "веб" - сервер

Непрочитанное сообщение ASD » 2009-06-24 12:49:30

paradox писал(а):почему один сокет?
один сокет слушает
а аксепт по этому сокету возращает новый сокет соединения
Хотел что то вроде такого...прошу не пинать...проект под винду был...

Код: Выделить всё

BOOL StartServer()
{
    BOOL retVal = TRUE;
    CString str;


    try {
        serverINSock = socket(PF_INET, SOCK_STREAM, 0);
        CSockAddr saServer(INADDR_ANY, serverINPort);
        if (bind(serverINSock, saServer, sizeof(saServer)) != 0) {
            
            retVal = FALSE;
        }

        if (listen(serverINSock, SOMAXCONN) != 0) {
            
            retVal = FALSE;
        }



        AfxBeginThread(ServerThread, NULL);

    }
    catch(CException* e) {
        e->Delete();
    }
    return retVal;
}

UINT ServerThread(LPVOID pParam)
{
    CSockAddr src;
    int x = sizeof(src);

    try {
    SOCKET t = accept(serverINSock, (sockaddr *)&src, &x);
    if (serverINSock != INVALID_SOCKET){

        //---------------------------------------------------

        if (t != INVALID_SOCKET) {
                    
            AfxBeginThread(ServerThread, pParam);    
            new INServer(new CSocketIO(t));
        }
    }
    }
    catch(CException* e) {
        e->Delete();
    }
   
    return 0;
}
а уже в CSocketIO реализовать евент на чтение/запись для кажого вновь созданного сокета....или все таки я не так понимаю....
Последний раз редактировалось ASD 2009-06-24 14:28:14, всего редактировалось 1 раз.

paradox
проходил мимо
Сообщения: 11620
Зарегистрирован: 2008-02-21 18:15:41

Re: самописный "веб" - сервер

Непрочитанное сообщение paradox » 2009-06-24 13:08:29

а уже в CSocketIO реализовать евент на чтение/запись для кажого вновь созданного сокета....или все таки я не так понимаю....
скажи нормально а то смысл фразы потерян

ASD
мл. сержант
Сообщения: 112
Зарегистрирован: 2008-12-25 20:19:54

Re: самописный "веб" - сервер

Непрочитанное сообщение ASD » 2009-06-24 13:22:20

paradox писал(а):
а уже в CSocketIO реализовать евент на чтение/запись для кажого вновь созданного сокета....или все таки я не так понимаю....
скажи нормально а то смысл фразы потерян
я имел ввиду что уже в объекте CSocketIO(это не принципиально, главное что сокет=объект) слушаем события по созданному(accept) сокету ...
что то вроде этого:

Код: Выделить всё

for (;;) 
{
..........................
	if ((n = kevent(kq, kev, ch, kev, nevents, NULL)) < 0)
........................
}

paradox
проходил мимо
Сообщения: 11620
Зарегистрирован: 2008-02-21 18:15:41

Re: самописный "веб" - сервер

Непрочитанное сообщение paradox » 2009-06-24 13:41:32

что то я не пойму что ты спрашиаешь
давай четкие вопросы

ASD
мл. сержант
Сообщения: 112
Зарегистрирован: 2008-12-25 20:19:54

Re: самописный "веб" - сервер

Непрочитанное сообщение ASD » 2009-06-24 13:52:34

paradox писал(а):что то я не пойму что ты спрашиаешь
давай четкие вопросы
видимо все таки я не понял что такое kevent - еще раз:
на вновь созданный(по accept-у) дескриптор сокета - вешаются события?
вернее регистрируется ли он в дескрипторе очереди сообщений ядра? или только регистрируется базовы сокет(listen)? если только на листен не понятно как определить от кого "коннект"

paradox
проходил мимо
Сообщения: 11620
Зарегистрирован: 2008-02-21 18:15:41

Re: самописный "веб" - сервер

Непрочитанное сообщение paradox » 2009-06-24 14:00:25

на вновь созданный(по accept-у) дескриптор сокета - вешаются события?
да
вернее регистрируется ли он в дескрипторе очереди сообщений ядра?
что ты понимаешь под регистрируються?
или только регистрируется базовы сокет(listen)?
регистрируються те что ты регистрируешь
если только на листен не понятно как определить от кого "коннект"
не только листен
а вообще откого коннект можно узнать по getpeername

наверное тебе стоит посмотреть на уже готовые реализации на основе kevent
например inetd в бсд вроде на kevent
ну и bsdproxy в порах есть - он точно на kevent

ну и в гугле полно библиотек всяких на select и kevent и poll
так сказать на все случаи жизни

ASD
мл. сержант
Сообщения: 112
Зарегистрирован: 2008-12-25 20:19:54

Re: самописный "веб" - сервер

Непрочитанное сообщение ASD » 2009-06-24 14:13:13

paradox писал(а):
на вновь созданный(по accept-у) дескриптор сокета - вешаются события?
да
ок! спасибо
paradox писал(а):
вернее регистрируется ли он в дескрипторе очереди сообщений ядра?
что ты понимаешь под регистрируються?

Код: Выделить всё

 if ( ( kq = kqueue() ) == -1 )
                exit(1);
EV_SET(&ke, fd, EVFILT_VNODE, EV_ADD|EV_CLEAR,  NOTE_WRITE, 0, NULL);
if ( kevent(kq, &ke, 1, NULL, 0, NULL) == -1 )
                exit(1);
paradox писал(а):
или только регистрируется базовы сокет(listen)?
регистрируються те что ты регистрируешь
примерно понятно....
paradox писал(а):
если только на листен не понятно как определить от кого "коннект"
не только листен
а вообще откого коннект можно узнать по getpeername
ну как то не красиво запрашивать getpeername после каждого события...
paradox писал(а): наверное тебе стоит посмотреть на уже готовые реализации на основе kevent
например inetd в бсд вроде на kevent
ну и bsdproxy в порах есть - он точно на kevent

ну и в гугле полно библиотек всяких на select и kevent и poll
так сказать на все случаи жизни
смотрю thttpd

ASD
мл. сержант
Сообщения: 112
Зарегистрирован: 2008-12-25 20:19:54

Re: самописный "веб" - сервер

Непрочитанное сообщение ASD » 2009-06-24 14:43:57

paradox писал(а):
на вновь созданный(по accept-у) дескриптор сокета - вешаются события?
да
а если 2 потока "повешают" событие, допустим - EVFILT_WRITE.....как грамотно обработать событие - что бы обоим досталось?

paradox
проходил мимо
Сообщения: 11620
Зарегистрирован: 2008-02-21 18:15:41

Re: самописный "веб" - сервер

Непрочитанное сообщение paradox » 2009-06-24 14:52:39

каких еще потока?

ASD
мл. сержант
Сообщения: 112
Зарегистрирован: 2008-12-25 20:19:54

Re: самописный "веб" - сервер

Непрочитанное сообщение ASD » 2009-06-24 15:18:55

paradox писал(а):каких еще потока?
я хотел чтобы при accepte-е стартовал поток, которому передавался сокет(созданный по accept-у), в потоке создавлся объект(класса "сокета"), объект вешал события на сокет....и так далее новое подключение -> accept -> поток-объект -> событие на сокет...
так вот а если при accept-e сокет будет передоваться 2м потокам, второй должен логировать "сырые" данные...

paradox
проходил мимо
Сообщения: 11620
Зарегистрирован: 2008-02-21 18:15:41

Re: самописный "веб" - сервер

Непрочитанное сообщение paradox » 2009-06-24 15:25:40

я хотел чтобы при accepte-е стартовал поток, которому передавался сокет(созданный по accept-у),
это будет не сервер
а тормознутый терминал
поскольку время создание потока в бсд очень медленное

тогда передумай полностью концепцию

поскольку kevent это Non-Blocked-IO идеология
где потоков нет

смысла юзать потоки для kevent я не вижу если чесно

если переходить на pthread то тогда kevent нужно выбрасывать
а что бы время на создание потока не затрачивалось
создаваь при старте самого демона
количество потоков которые будут обрабатывать данные...
как напимер в mysql сервере и прочих....

ASD
мл. сержант
Сообщения: 112
Зарегистрирован: 2008-12-25 20:19:54

Re: самописный "веб" - сервер

Непрочитанное сообщение ASD » 2009-07-23 9:55:26

Подскажите почему клиент, не обрывает соединения после получения такой вот конструкции....а находится в режиме "открытия страницы http://......
HTTP/1.0 200
Server: ABOS0.1.0
Date: Thu, 23 Jul 2009 06:02:11 GMT
Content-Type: text/html; charset=Hз
Cache-Control: max-age=1
Expires: Thu, 23 Jul 2009 06:02:12 GMT
Connection: close

<html>
<head>
<title>МОЙ ПЕРВЫЙ ВЕБ_СЕРВЕР!!!!</title>
</head>
<body bgcolor="white" text="black">
<center><h1>И СКОРЕЕ ВСЕГО ПОСЛЕДНИЙ!!!!</h1></center>
</body>
</html>

Аватара пользователя
xDi
мл. сержант
Сообщения: 118
Зарегистрирован: 2009-01-01 20:27:26

Re: самописный "веб" - сервер

Непрочитанное сообщение xDi » 2009-08-28 19:29:48

ASD писал(а):Всем, хорошего настроения

Хотелось бы написать самописный "веб"-сервер.Есть опыт програмирования на С++ в видузе...поэтому не совсем все понятно *nix

1. Что можно почитать про многопоточность во FreeBSD
2. Так же хотел узнать как можно использовать CGI-программы в самописном сервере?
3. посоветуйте консольный IDE
Рекоммендую книги Стивенса "UNIX. Разработка сетевых приложений" и "UNIX. Взаимодействие процессов". Очень хорошо расписано. Именно прочитав их я и написал свой веб-сервер. Алгоритм многопоточного сервера был такой:

главный поток:
1. Запускаем сервер, проверив не запущена ли уже копия.
2. Инициализация (чтение конфигов и пр)
3. Создание сокета, привязка к адресу, постановка на прослушивание.
4. Запескаем поток диспетчеров потока
5. Бесконечное ожидание останова

диспетчер потоков (запускается по сигналу таймера (SIGALRM):
1. проверяет необходимость порождения рабочих потоков (как это реализуете - решать вам)
2. если требуется, плодит рабочие потоки
3. запускает таймер

рабочий поток работает в бесконечном цикле:
1. блокирует мютекс
2. принимает соединение
3. разблокирует мютекс
4. выполняет полезную работу
5. проверяет необходимость суицида (опять же механизм зависит от вашей реализации управления колличеством рабочих потоков. т.е. диспетчер потоков будет их плодить, если нехватает, а если избыток, то очередной поток себя завершит).

т.о. в процессе постоянно существует некоторое колличество рабочих потоков, при чем только один поток готов приниммать соединение (за счет мютекса).

подводные камни:
- исключение повисаний в заблокированом ожидании соединения (решил поллингом. как вариант - неблокируемые сокеты)
- механизм завершения (решил это обработкой сигналов)
- были и другие, сейчас на вскидку не вспомню.

Аватара пользователя
Alex Keda
стреляли...
Сообщения: 35457
Зарегистрирован: 2004-10-18 14:25:19
Откуда: Made in USSR
Контактная информация:

Re: самописный "веб" - сервер

Непрочитанное сообщение Alex Keda » 2009-08-30 16:57:58

апач чтоли 1.x писал? =)
Убей их всех! Бог потом рассортирует...

Аватара пользователя
xDi
мл. сержант
Сообщения: 118
Зарегистрирован: 2009-01-01 20:27:26

Re: самописный "веб" - сервер

Непрочитанное сообщение xDi » 2009-08-30 21:59:50

lissyara писал(а):апач чтоли 1.x писал? =)
Нет, первый апач не многопоточный. Там механизм похожий, но плодятся не потоки (thread), а ветвятся (fork) дочерние процессы.
Я писал сервер под узкую задачу: наиболее эффективно (с точки зрения ресурсов) отдавать сравнительно большие статические файлы большому числу медленных клиентов.