Предохраняйся носками! Докучаев Дмитрий aka Forb Xakep, номер #066, стр. 066-118-4 Дальше - больше. Откроем бесконечный цикл, в котором перебираем все сокеты с данными. Если таковой имеется и его идентификатор совпадает с клиентским - поспешно считываем из него информацию и передаем ее удаленному узлу. Мы народ нечестный, поэтому беззаботно снифаем данные в случае активной переменной $sniff :). Когда идентификатор равен удаленному сокету - поступаем с точностью до наоборот - данные берутся с сервера и пересылаются клиенту. Если по какой-то причине та или другая сторона разорвала соединение (всякое бывает), контроль не теряется - после чтения инфы постоянно анализируется переменная-буфер. Когда она не определена - сокет мертв, и нужно корректно закрыть второе соединение с последующим занулением файла (если ведется запись данных). Таким образом, процесс завершится только по воле клиента (либо при форс-мажорных обстоятельствах ;)), как и было задумано. Вот, собственно, и весь наш проект. Запускать его можно на любом шелле, даже на виндовом :). Если ты желаешь более подробно изучить мои соксы (в рамках одной статьи все нюансы не описать) - изучай выложенные (http://kamensk.net.ru/forb/1/x/socks.tar.gz) сорцы либо шли свои вопросы на мыло. Мочим зазевавшихся При завершении потомка нужно проследить, чтобы процесс корректно исчез из таблицы. В противном случае, в proc_table появится зомби. Когда в потомке встречается exit, ему посылается сигнал CHLD, который должен быть обработан. В соксах при таком сигнале управление передается процедуре kill_fork(). Там с помощью модуля POSIX вызывается функция waitpid(). Она дожидается корректного завершения и возвращает процесс убитого. Либо -1, когда потомок уже умер :). Не будем вникать в технику, главное, что при юзании этой конструкции таблица чиста от назойливых зомбей. Применение проксика Этот демон проверялся на следующих сервисах: smtp, pop3, ssh, telnet, ftp, www, irc и показал отличный результат. Из-за принципов протокола, его невозможно подвязать к аське, но при желании ты можешь добиться этого самостоятельно. Портированная версия Если хочешь использовать прокси-сервер на машине без Perl-интерпретатора, слей программу Perl2exe и получи независимый exe-файл. Скачать софтину можно по адресу www.indigostar.com/download/p2x-8.00-Win32.zip. INFO Порт для соединения-туннеля берется из принципа $srartport+целая_часть(рандом($portlimit)). Указанные переменные инициализированы в начале скрипта. CD На диске ты найдешь полный исходник моего проксика, а также программу Perl2Exe для превращения скрипта в исполняемый файл. |