Пример реализации inetd для Windows
От: Александр Пристенский  
Дата: 12.07.05 07:31
Оценка: 210 (10) +1
Статья:
Пример реализации inetd для Windows
Автор(ы): Александр Пристенский
Дата: 12.07.2005
Пример реализации inetd для windows представляет собой многопоточный сервер, запускающий дочерние процессы (консольные приложения) ввод-вывод которых перенаправляется на сокет.


Авторы:
Александр Пристенский

Аннотация:
Пример реализации inetd для windows представляет собой многопоточный сервер, запускающий дочерние процессы (консольные приложения) ввод-вывод которых перенаправляется на сокет.
Re: Пример реализации inetd для Windows
От: Andrew S Россия http://alchemy-lab.com
Дата: 12.10.05 07:14
Оценка: +1
АП>Пример реализации inetd для windows представляет собой многопоточный сервер, запускающий дочерние процессы (консольные приложения) ввод-вывод которых перенаправляется на сокет.

Статья неплохая, но несколько замечаний.
1.

Поскольку _beginthreadex() требует полный путь к исполняемому файлу


Наверное, имелось в виду CreateProcess? Но и в этом случае, выделенная фраза неверна — при задании пути в параметре lpCommandLine поведение при поиске аналогично стандартному в cmd.
2. Поскольку в Win NT вполне можно передавать в качестве стандартных хендлов сокеты, то очевидно, необходимости создавать промежуточные пайпы (и лишние треды) там нет. Достаточно правильно создать сокет. Например, как здесь
Автор: Andrew S
Дата: 19.07.05
http://www.rusyaz.ru/pr — стараемся писАть по-русски
Re: Пример реализации inetd для Windows
От: Olegator  
Дата: 13.10.05 00:02
Оценка: +1 :)
Здравствуйте, Александр Пристенский, Вы писали:

АП>Пример реализации inetd для windows представляет собой многопоточный сервер, запускающий дочерние процессы (консольные приложения) ввод-вывод которых перенаправляется на сокет.


Маленькое замечание по коду:
printf("\nWSAStartup() failed with error: %i", WSAGetLastError());

В случае неудачи WSAStartup() код ошибки нельзя получить функцией WSAGetLastError(). WSAStartup() сама должна вернуть его.
Re: Пример реализации inetd для Windows
От: vnp  
Дата: 13.10.05 02:02
Оценка:
Здравствуйте, Александр Пристенский, Вы писали:

АП>Статья:

АП>Пример реализации inetd для Windows
Автор(ы): Александр Пристенский
Дата: 12.07.2005
Пример реализации inetd для windows представляет собой многопоточный сервер, запускающий дочерние процессы (консольные приложения) ввод-вывод которых перенаправляется на сокет.


АП>Авторы:

АП> Александр Пристенский

АП>Аннотация:

АП>Пример реализации inetd для windows представляет собой многопоточный сервер, запускающий дочерние процессы (консольные приложения) ввод-вывод которых перенаправляется на сокет.

Несколько замечаний:

— Довольно странная реализация keep-alive, которая почему-то делается вмешательством в application protocol. Время от времени сервер отправляет 1 байт. Этот байт дойдет до клиента. Что, спрашивается, клиент должен с ним делать? А ведь keep-alive поддерживается на транспортном уровне (SO_KEEPALIVE).

Кстати:

Несколько слов о keep-alive сообщениях. Допустим у клиента возникли проблемы с соединением — сбой сети, неожиданное закрытие клиентского приложения из-за ошибки и т.д. Цикл чтения-записи будет при этом продолжаться бесконечно – функция select() будет завершаться, и констатировать просто отсутствие данных от клиента


Это не так. select покажет, что сокет можно читать, а recv скажет, что прочел 0 байтов. Выполнение этих двух условий однозначно определяет, что партнер закрыл свою сторону, и данных от него больше никогда не будет.

— Определение состояния канала по состоянию дочернего процесса. Сомнительная техника. Например, дочерний процесс породил внучку, передал ей каналы, и завершился. Беда.

— Что там такое с телнетом, я совсем не понял. Не кажется ли, что сервер много на себя берет?

Послушайте! Ведь если байты посылают,
Значит это кому-нибудь нужно,
Значит, кто-то хочет, чтоб они были...

... а сервер их раз, и фильтрует.

— send тоже имеет право заблокироваться, и writability тоже надо проверять селектом.

Пока, вроде бы, все.
Re[2]: Пример реализации inetd для Windows
От: Odi$$ey Россия http://malgarr.blogspot.com/
Дата: 13.10.05 03:51
Оценка:
Здравствуйте, vnp, Вы писали:

vnp>- Что там такое с телнетом, я совсем не понял.


в выводе команды dir например есть байты FF, когда этот вывод отсылается телнету он воспринимает то что после FF как команды себе родному и честно пытается эту случайную муть выполнять, хотя dir ничего такого ввиду не имел

vnp>Не кажется ли, что сервер много на себя берет?


дык ведь только если попросишь через опцию –FF

vnp>

vnp>Послушайте! Ведь если байты посылают,
vnp>Значит это кому-нибудь нужно,
vnp>Значит, кто-то хочет, чтоб они были...

vnp>... а сервер их раз, и фильтрует.

а какие еще варианты?
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[3]: Пример реализации inetd для Windows
От: vnp  
Дата: 13.10.05 06:25
Оценка:
Здравствуйте, Odi$$ey, Вы писали:

OE>Здравствуйте, vnp, Вы писали:


vnp>>- Что там такое с телнетом, я совсем не понял.


OE>в выводе команды dir например есть байты FF, когда этот вывод отсылается телнету он воспринимает то что после FF как команды себе родному и честно пытается эту случайную муть выполнять, хотя dir ничего такого ввиду не имел


OE>а какие еще варианты?


Одно из двух:
а) Оставить сервер прозрачным и возложить ответственность на клиента.
б) Честно интерпретировать протокол. Понимать, когда 0xff это IAC (и оставлять его в потоке), а когда — просто банан (и дублировать).

Первое решение мне кажется предпочтительным (если не сказать правильным).

vnp>>Не кажется ли, что сервер много на себя берет?


OE>дык ведь только если попросишь через опцию –F


Дык ведь заранее не скажешь, кто с той стороны будет подсоединяться.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.