[Moscow.pm] unix socket
Dmitry E. Oboukhov
dimka на uvw.ru
Пт Май 23 23:16:46 PDT 2008
> perlipc исползан вдоль и поперек.
> поясню задачу. Есть связка server(15 тредов) + много клиентов которые
> через unix socket с ним работают.
> Если я цепляюсь не клиентом, а своим скриптом к unix сокету, то не вижу
> ни начального ответа от сервера, при передаче данных
> в сокет не вижу response. Также если цепляю клиента к созданному мной
> unix сокету, то тоже ноль эффект. Поэтому хочу понять
> что бегает внутри этого долбаного unix socket чтобы эмулировать данный
> протокол. perlipc только рассказывает как якобы создать
> unix socket, а не как его послушать и посмотреть.
ах вот ты о чем.
скорее всего цепляясь не клиентом ты не вписываешься в протокол и
поэтому ничего не видишь.
я бы сделал примерно так:
написал бы классик вроде:
package MyClass;
use base qw(Net::Server::Single);
sub process_request
{
my $socket=new IO::Socket::UNIX(Peer=>'сокет твоего сервера')
// тут читаем из sidin и пишем в сокет
// читаем из сокета и пишем в stdout
// заодно тут же пишем логи кто кому чего сказал
// итп
}
package main;
my $wrapper=new MyClass(port=>'путь к твоему сокету|unix');
$wrapper->run;
ну и разглядывал бы логи:)
только чтение/запись из двух сокетов (один сокет и два пайпа
std(in|out)) разруливать наверно надо при помощи функции select,
хотя для начала можно попробовать "принять решение" что протокол
там текстовый и просто почитать строки из клиента и поотдавать их
серверу и наоборот.
хотя если на какие-то однострочные запросы клиента сервер отвечает
многострочным ответом, то все равно упрется в select.
то есть для начала написать там код вида:
my $line_from_client=<STDIN>;
... тут кладем в лог инфу о том что приняты данные от клиента
print $socket $line_from_client;
my $line_from_server=<$socket>;
... тут кладем в лог инфу что принято что-то от сервера
но скорее всего залочится, попробуешь две-три строки принимать от
сервера/клиента, ну и перейдешь на select ;)
Подробная информация о списке рассылки Moscow-pm