[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