самописный "веб" - сервер
Модератор: Fastman
Правила форума
Убедительная просьба юзать теги [code] при оформлении листингов.
Сообщения не оформленные должным образом имеют все шансы быть незамеченными.
Убедительная просьба юзать теги [code] при оформлении листингов.
Сообщения не оформленные должным образом имеют все шансы быть незамеченными.
-
- мл. сержант
- Сообщения: 112
- Зарегистрирован: 2008-12-25 20:19:54
самописный "веб" - сервер
Всем, хорошего настроения
Хотелось бы написать самописный "веб"-сервер.Есть опыт програмирования на С++ в видузе...поэтому не совсем все понятно *nix
1. Что можно почитать про многопоточность во FreeBSD
2. Так же хотел узнать как можно использовать CGI-программы в самописном сервере?
3. посоветуйте консольный IDE
Хотелось бы написать самописный "веб"-сервер.Есть опыт програмирования на С++ в видузе...поэтому не совсем все понятно *nix
1. Что можно почитать про многопоточность во FreeBSD
2. Так же хотел узнать как можно использовать CGI-программы в самописном сервере?
3. посоветуйте консольный IDE
Услуги хостинговой компании Host-Food.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/
Тарифы на виртуальные сервера (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/
-
- полковник
- Сообщения: 5845
- Зарегистрирован: 2007-12-07 13:51:33
- Откуда: Верх-Нейвинск
Re: самописный "веб" - сервер
man forkASD писал(а):1. Что можно почитать про многопоточность во FreeBSD
как реализуешь сервер так и будешь использоватьASD писал(а):2. Так же хотел узнать как можно использовать CGI-программы в самописном сервере?

многие говорят vim, насколько это правда не знаю. Некоторые сидят в mc, я сижу в eeASD писал(а):3. посоветуйте консольный IDE

-
- проходил мимо
- Сообщения: 11620
- Зарегистрирован: 2008-02-21 18:15:41
Re: самописный "веб" - сервер
зачем?Хотелось бы написать самописный "веб"-сервер.Есть опыт програмирования на С++ в видузе...поэтому не совсем все понятно *nix
многопоточность на бсд это вчерашнее время1. Что можно почитать про многопоточность во FreeBSD
читаем о man kevent
это вопрос не к самописному серверу2. Так же хотел узнать как можно использовать CGI-программы в самописном сервере?
а к вам
vi/vim3. посоветуйте консольный IDE
-
- лейтенант
- Сообщения: 975
- Зарегистрирован: 2008-01-29 20:08:41
- Откуда: РБ, Минск
-
- мл. сержант
- Сообщения: 112
- Зарегистрирован: 2008-12-25 20:19:54
Re: самописный "веб" - сервер
пошел по варианту threadzg писал(а):man forkASD писал(а):1. Что можно почитать про многопоточность во FreeBSD
блин, все равно не понятно....ладно как дойду спрошуzg писал(а):как реализуешь сервер так и будешь использоватьASD писал(а):2. Так же хотел узнать как можно использовать CGI-программы в самописном сервере?это к HTTP никак не относится, насколько я знаю.

Пишу в MS VC2005....по фтп на фряху....сойдет на первое времяzg писал(а):многие говорят vim, насколько это правда не знаю. Некоторые сидят в mc, я сижу в eeASD писал(а):3. посоветуйте консольный IDE
-
- мл. сержант
- Сообщения: 112
- Зарегистрирован: 2008-12-25 20:19:54
Re: самописный "веб" - сервер
я так понимаю после каждого accept-а я должен вешать kevent на вновь созданный сокет?paradox писал(а):многопоточность на бсд это вчерашнее время1. Что можно почитать про многопоточность во FreeBSD
читаем о man kevent
-
- проходил мимо
- Сообщения: 11620
- Зарегистрирован: 2008-02-21 18:15:41
Re: самописный "веб" - сервер
зачем создавать сокет?
у тебя уже есть сокет который слушает
а аксепт тебе уже возращает сокет при коннекте
у тебя уже есть сокет который слушает
а аксепт тебе уже возращает сокет при коннекте
-
- мл. сержант
- Сообщения: 112
- Зарегистрирован: 2008-12-25 20:19:54
Re: самописный "веб" - сервер
разве не?paradox писал(а):зачем создавать сокет?
у тебя уже есть сокет который слушает
а аксепт тебе уже возращает сокет при коннекте
-
- мл. сержант
- Сообщения: 112
- Зарегистрирован: 2008-12-25 20:19:54
Re: самописный "веб" - сервер
Ясно, что я туплю...но честно не могу понять...т.е. один сокет для всех соединений?paradox писал(а):зачем создавать сокет?
у тебя уже есть сокет который слушает
а аксепт тебе уже возращает сокет при коннекте
-
- проходил мимо
- Сообщения: 11620
- Зарегистрирован: 2008-02-21 18:15:41
Re: самописный "веб" - сервер
почему один сокет?
один сокет слушает
а аксепт по этому сокету возращает новый сокет соединения
один сокет слушает
а аксепт по этому сокету возращает новый сокет соединения
-
- мл. сержант
- Сообщения: 112
- Зарегистрирован: 2008-12-25 20:19:54
Re: самописный "веб" - сервер
Хотел что то вроде такого...прошу не пинать...проект под винду был...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;
}
Последний раз редактировалось ASD 2009-06-24 14:28:14, всего редактировалось 1 раз.
-
- проходил мимо
- Сообщения: 11620
- Зарегистрирован: 2008-02-21 18:15:41
Re: самописный "веб" - сервер
скажи нормально а то смысл фразы потеряна уже в CSocketIO реализовать евент на чтение/запись для кажого вновь созданного сокета....или все таки я не так понимаю....
-
- мл. сержант
- Сообщения: 112
- Зарегистрирован: 2008-12-25 20:19:54
Re: самописный "веб" - сервер
я имел ввиду что уже в объекте CSocketIO(это не принципиально, главное что сокет=объект) слушаем события по созданному(accept) сокету ...paradox писал(а):скажи нормально а то смысл фразы потеряна уже в CSocketIO реализовать евент на чтение/запись для кажого вновь созданного сокета....или все таки я не так понимаю....
что то вроде этого:
Код: Выделить всё
for (;;)
{
..........................
if ((n = kevent(kq, kev, ch, kev, nevents, NULL)) < 0)
........................
}
-
- проходил мимо
- Сообщения: 11620
- Зарегистрирован: 2008-02-21 18:15:41
Re: самописный "веб" - сервер
что то я не пойму что ты спрашиаешь
давай четкие вопросы
давай четкие вопросы
-
- мл. сержант
- Сообщения: 112
- Зарегистрирован: 2008-12-25 20:19:54
Re: самописный "веб" - сервер
видимо все таки я не понял что такое kevent - еще раз:paradox писал(а):что то я не пойму что ты спрашиаешь
давай четкие вопросы
на вновь созданный(по accept-у) дескриптор сокета - вешаются события?
вернее регистрируется ли он в дескрипторе очереди сообщений ядра? или только регистрируется базовы сокет(listen)? если только на листен не понятно как определить от кого "коннект"
-
- проходил мимо
- Сообщения: 11620
- Зарегистрирован: 2008-02-21 18:15:41
Re: самописный "веб" - сервер
дана вновь созданный(по accept-у) дескриптор сокета - вешаются события?
что ты понимаешь под регистрируються?вернее регистрируется ли он в дескрипторе очереди сообщений ядра?
регистрируються те что ты регистрируешьили только регистрируется базовы сокет(listen)?
не только листенесли только на листен не понятно как определить от кого "коннект"
а вообще откого коннект можно узнать по getpeername
наверное тебе стоит посмотреть на уже готовые реализации на основе kevent
например inetd в бсд вроде на kevent
ну и bsdproxy в порах есть - он точно на kevent
ну и в гугле полно библиотек всяких на select и kevent и poll
так сказать на все случаи жизни
-
- мл. сержант
- Сообщения: 112
- Зарегистрирован: 2008-12-25 20:19:54
Re: самописный "веб" - сервер
ок! спасибо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)?
ну как то не красиво запрашивать getpeername после каждого события...paradox писал(а):не только листенесли только на листен не понятно как определить от кого "коннект"
а вообще откого коннект можно узнать по getpeername
смотрю thttpdparadox писал(а): наверное тебе стоит посмотреть на уже готовые реализации на основе kevent
например inetd в бсд вроде на kevent
ну и bsdproxy в порах есть - он точно на kevent
ну и в гугле полно библиотек всяких на select и kevent и poll
так сказать на все случаи жизни
-
- мл. сержант
- Сообщения: 112
- Зарегистрирован: 2008-12-25 20:19:54
Re: самописный "веб" - сервер
а если 2 потока "повешают" событие, допустим - EVFILT_WRITE.....как грамотно обработать событие - что бы обоим досталось?paradox писал(а):дана вновь созданный(по accept-у) дескриптор сокета - вешаются события?
-
- проходил мимо
- Сообщения: 11620
- Зарегистрирован: 2008-02-21 18:15:41
Re: самописный "веб" - сервер
каких еще потока?
-
- мл. сержант
- Сообщения: 112
- Зарегистрирован: 2008-12-25 20:19:54
Re: самописный "веб" - сервер
я хотел чтобы при accepte-е стартовал поток, которому передавался сокет(созданный по accept-у), в потоке создавлся объект(класса "сокета"), объект вешал события на сокет....и так далее новое подключение -> accept -> поток-объект -> событие на сокет...paradox писал(а):каких еще потока?
так вот а если при accept-e сокет будет передоваться 2м потокам, второй должен логировать "сырые" данные...
-
- проходил мимо
- Сообщения: 11620
- Зарегистрирован: 2008-02-21 18:15:41
Re: самописный "веб" - сервер
это будет не серверя хотел чтобы при accepte-е стартовал поток, которому передавался сокет(созданный по accept-у),
а тормознутый терминал
поскольку время создание потока в бсд очень медленное
тогда передумай полностью концепцию
поскольку kevent это Non-Blocked-IO идеология
где потоков нет
смысла юзать потоки для kevent я не вижу если чесно
если переходить на pthread то тогда kevent нужно выбрасывать
а что бы время на создание потока не затрачивалось
создаваь при старте самого демона
количество потоков которые будут обрабатывать данные...
как напимер в mysql сервере и прочих....
-
- мл. сержант
- Сообщения: 112
- Зарегистрирован: 2008-12-25 20:19:54
Re: самописный "веб" - сервер
Подскажите почему клиент, не обрывает соединения после получения такой вот конструкции....а находится в режиме "открытия страницы 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: самописный "веб" - сервер
Рекоммендую книги Стивенса "UNIX. Разработка сетевых приложений" и "UNIX. Взаимодействие процессов". Очень хорошо расписано. Именно прочитав их я и написал свой веб-сервер. Алгоритм многопоточного сервера был такой:ASD писал(а):Всем, хорошего настроения
Хотелось бы написать самописный "веб"-сервер.Есть опыт програмирования на С++ в видузе...поэтому не совсем все понятно *nix
1. Что можно почитать про многопоточность во FreeBSD
2. Так же хотел узнать как можно использовать CGI-программы в самописном сервере?
3. посоветуйте консольный IDE
главный поток:
1. Запускаем сервер, проверив не запущена ли уже копия.
2. Инициализация (чтение конфигов и пр)
3. Создание сокета, привязка к адресу, постановка на прослушивание.
4. Запескаем поток диспетчеров потока
5. Бесконечное ожидание останова
диспетчер потоков (запускается по сигналу таймера (SIGALRM):
1. проверяет необходимость порождения рабочих потоков (как это реализуете - решать вам)
2. если требуется, плодит рабочие потоки
3. запускает таймер
рабочий поток работает в бесконечном цикле:
1. блокирует мютекс
2. принимает соединение
3. разблокирует мютекс
4. выполняет полезную работу
5. проверяет необходимость суицида (опять же механизм зависит от вашей реализации управления колличеством рабочих потоков. т.е. диспетчер потоков будет их плодить, если нехватает, а если избыток, то очередной поток себя завершит).
т.о. в процессе постоянно существует некоторое колличество рабочих потоков, при чем только один поток готов приниммать соединение (за счет мютекса).
подводные камни:
- исключение повисаний в заблокированом ожидании соединения (решил поллингом. как вариант - неблокируемые сокеты)
- механизм завершения (решил это обработкой сигналов)
- были и другие, сейчас на вскидку не вспомню.
- Alex Keda
- стреляли...
- Сообщения: 35426
- Зарегистрирован: 2004-10-18 14:25:19
- Откуда: Made in USSR
- Контактная информация:
- xDi
- мл. сержант
- Сообщения: 118
- Зарегистрирован: 2009-01-01 20:27:26
Re: самописный "веб" - сервер
Нет, первый апач не многопоточный. Там механизм похожий, но плодятся не потоки (thread), а ветвятся (fork) дочерние процессы.lissyara писал(а):апач чтоли 1.x писал?
Я писал сервер под узкую задачу: наиболее эффективно (с точки зрения ресурсов) отдавать сравнительно большие статические файлы большому числу медленных клиентов.