<?xml version="1.0"?><!-- generator="bbPress" -->

<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
>

<channel>
<title>Erlang по-русски. Форум Тема: Как посылать сообщения?</title>
<link>http://erlang.dmitriid.com/forum/</link>
<description>Erlang по-русски. Форум Тема: Как посылать сообщения?</description>
<language>en</language>
<pubDate>Tue, 18 Nov 2008 04:19:58 +0000</pubDate>

<item>
<title>qrilka   "Как посылать сообщения?"</title>
<link>http://erlang.dmitriid.com/forum/topic/14#post-57</link>
<pubDate>Tue, 18 Dec 2007 14:20:32 +0000</pubDate>
<dc:creator>qrilka</dc:creator>
<guid isPermaLink="false">57@http://erlang.dmitriid.com/forum/</guid>
<description>&lt;p&gt;Естественно оно выдаст undef - функция-то не экспортирована, поэтому spawn её не видит.
&lt;/p&gt;</description>
</item>
<item>
<title>Cyberon   "Как посылать сообщения?"</title>
<link>http://erlang.dmitriid.com/forum/topic/14#post-56</link>
<pubDate>Fri, 14 Dec 2007 22:06:20 +0000</pubDate>
<dc:creator>Cyberon</dc:creator>
<guid isPermaLink="false">56@http://erlang.dmitriid.com/forum/</guid>
<description>&lt;p&gt;Отказался от идеи посылки сообщений о вычисленном хеше клиентам. Написал код сервера и набросок кода клиента. Сервер запускается без проблем, но клиент не может к нему подсоединиться - выдает ошибку.&lt;br /&gt;
Запуск сервера&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;
erl -sname brute
Eshell V5.6  (abort with ^G)
(brute@warez)1&amp;gt; server:start_server([{[1,2],[\&quot;abcde\&quot;,\&quot;abjasf\&quot;,\&quot;ds\&quot;,\&quot;1234\&quot;,\&quot;12345\&quot;]}]).
User list = []
 Task list = [{[1,2],
               [\&quot;ds\&quot;,\&quot;1234\&quot;,\&quot;12345\&quot;],
               [{1,5,\&quot;abcde\&quot;},{1,6,\&quot;abjasf\&quot;}]}]
true
(brute@warez)2&amp;gt; 

Запуск клиента
erl -sname client
Eshell V5.6  (abort with ^G)
(client@warez)1&amp;gt; client:start_client(brute@warez).
 &amp;lt;0.37.0&amp;gt;

=ERROR REPORT==== 14-Dec-2007::22:01:36 ===
Error in process &amp;lt;0.37.0&amp;gt; on node 'client@warez' with exit value: {undef,[{client,client,['brute@warez']}]}

(client@warez)2&amp;gt; 

Код сервера
&amp;lt;%%% Процесс сервера службы отправки сообщений
%%% task[{[Hash],[RangeSymbol]}] 

-module(server).
-export([start_server/1, server/1, server/2, next/1, next2/1]).
-import(lists, [keymember/3, keysearch/3, keydelete/3, keyreplace/4, unzip/1,
  subtract/2, keyreplace/4, split/2, nth/2, map/2]).
-include(\&quot;mess_interface.hrl\&quot;).

%%% Список пользователей имеет формат [{ClientPid1, Hashes1, String1, Task1},
%%% {ClientPid22, Hashes22, String22, Task22}, ...]
%%% Tasks = [ { [{I, L, Sym}], [Hash], ClientRange} ]
%%% Task = {[Hash], Prefix, Range}
%%% Result = [{Hash, Pass}]
server(User_List, [{Prefix, Hashes, ClientRange}|Task_List]) -&amp;gt;
  io:format(\&quot;User list = ~p~n Task list = ~p~n\&quot;, [User_List,[{Prefix, Hashes, ClientRange}|Task_List]]),
  receive
  #logon{client_pid=From} -&amp;gt;
    case keymember(From, 1, User_List) of
      true -&amp;gt;
        server(User_List, Task_List);
      false -&amp;gt;
        String = makeString(Prefix),
        From!{Hashes, String, ClientRange},
        New_User_List=[{From, Hashes, String, ClientRange}|User_List],
        server(New_User_List, next([{Prefix, Hashes, ClientRange}|Task_List]))
    end;
  {'EXIT', From, _} -&amp;gt;
    {value, {_, Old_Hashes, String, Task} } = keysearch(From, 1, User_List),
    New_User_List=keydelete(From, 1, User_List),
    server(New_User_List, [makeTask(String, Old_Hashes, Task)|Task_List]);
  #notfound{client_pid=From} -&amp;gt;
    String = makeString(Prefix),
    New_User_List = keyreplace(From, 1, User_List, {From, Hashes, String, ClientRange}),
    From!{Hashes, String, ClientRange},
    server(New_User_List, next([{Prefix, Hashes, ClientRange}|Task_List]));
  #found{client_pid=From, result=Result} -&amp;gt;
    {Solved_Hashes,_} = unzip(Result),
    New_Hashes=subtract(Hashes,Solved_Hashes),
    String = makeString(Prefix),
    From!{New_Hashes, String, ClientRange},
    master!Result,
    New_User_List = keyreplace(From, 1, User_List, {From, Hashes, String, ClientRange}),
    server(New_User_List, next([{Prefix, New_Hashes, ClientRange}|Task_List]))
end;
server(_, []) -&amp;gt;
  exit(normal).

server(Task_List) -&amp;gt;
  process_flag(trap_exit, true),
  New_Task_List = makeTasks(Task_List),
  server([], New_Task_List).

%%% Запуск сервера

start_server(Task_List) -&amp;gt;
  register(bruteserver, spawn(?MODULE, server, [Task_List])).

makeTasks([{Hashes,Range}|Rest]) -&amp;gt;
  {ServerRange,ClientRange}=split(length(Range)-3, Range),
  [{Hashes, ClientRange, makeServerSide(ServerRange)}|makeTasks(Rest)];
makeTasks([]) -&amp;gt; [].

makeString([{I,_,Sym}|Rest]) -&amp;gt; [nth(I,Sym)|makeString(Rest)];
makeString([]) -&amp;gt; [].

makeTask(String, Old_Hashes, Task) -&amp;gt;
  {map(fun(x)-&amp;gt;{1, 1, x} end, String), Old_Hashes, Task}.

makeServerSide([Sym|Rest]) -&amp;gt; [{1, length(Sym), Sym}|makeServerSide(Rest)];
makeServerSide([]) -&amp;gt; [].

next([{Prefix, _, _}|Rest]) -&amp;gt;
  {F,Pnext}=next2(Prefix),
  if
    F==1 -&amp;gt; [Pnext|Rest];
    true -&amp;gt; Rest
  end.

next2([])-&amp;gt;	{0,[]};
next2([{I,L,Sym}|Rest])-&amp;gt;
  if
    I&amp;lt;L-&amp;gt;	{1,[{I+1,L,Sym}|Rest]};
    true-&amp;gt;
      {Flag,R}=next2(Rest),
      {Flag,[{1,L,Sym}|R]}
  end.
&amp;gt;

Код клиента
&amp;lt;-module(client).
-export([start_client/1, passes/2, pass/1]).

client(Server_Node)-&amp;gt;
{bruteserver, Server_Node}!{logon, self()},
receive
  A-&amp;gt;io:format(\&quot;client got ~p~n\&quot;,[A])
end.

start_client(Server_Node)-&amp;gt;
spawn(client, client, [Server_Node]).

passes(Hashes,Range)-&amp;gt;
  [P||P&amp;lt;-pass(Range), H&amp;lt;-Hashes, erlang:md5(P)==H].

pass([X|Xs])-&amp;gt;
[[A|B] || A&amp;lt;-X, B&amp;lt;-pass(Xs)];
pass([])-&amp;gt; [[]].&amp;gt;
&lt;/code&gt;&lt;/pre&gt;</description>
</item>
<item>
<title>Cyberon   "Как посылать сообщения?"</title>
<link>http://erlang.dmitriid.com/forum/topic/14#post-50</link>
<pubDate>Thu, 25 Oct 2007 14:31:09 +0000</pubDate>
<dc:creator>Cyberon</dc:creator>
<guid isPermaLink="false">50@http://erlang.dmitriid.com/forum/</guid>
<description>&lt;p&gt;Кода еще нет - не хватает времени. Вообще люблю сначала представить всю структуру программы в уме/на бумаге и только затем писать.&lt;br /&gt;
Проблему с определителем решил. Можно перебирать в определителе только 2-3 последних символа, потом по совету 3BEP добавить receive. Это не должно повлиять на производительность.
&lt;/p&gt;</description>
</item>
<item>
<title>architect   "Как посылать сообщения?"</title>
<link>http://erlang.dmitriid.com/forum/topic/14#post-49</link>
<pubDate>Mon, 22 Oct 2007 16:21:23 +0000</pubDate>
<dc:creator>architect</dc:creator>
<guid isPermaLink="false">49@http://erlang.dmitriid.com/forum/</guid>
<description>&lt;p&gt;Код покажи
&lt;/p&gt;</description>
</item>
<item>
<title>Cyberon   "Как посылать сообщения?"</title>
<link>http://erlang.dmitriid.com/forum/topic/14#post-48</link>
<pubDate>Sat, 20 Oct 2007 19:14:02 +0000</pubDate>
<dc:creator>Cyberon</dc:creator>
<guid isPermaLink="false">48@http://erlang.dmitriid.com/forum/</guid>
<description>&lt;p&gt;Но если у меня вся обработка в определителе списка?
&lt;/p&gt;</description>
</item>
<item>
<title>3BEP   "Как посылать сообщения?"</title>
<link>http://erlang.dmitriid.com/forum/topic/14#post-45</link>
<pubDate>Thu, 18 Oct 2007 16:38:07 +0000</pubDate>
<dc:creator>3BEP</dc:creator>
<guid isPermaLink="false">45@http://erlang.dmitriid.com/forum/</guid>
<description>&lt;p&gt;В процессе который будет заниматься обработкой, в конце добавить конструкцию вида:&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;
    receive&lt;br /&gt;
        {interrupt} -&amp;gt;&lt;br /&gt;
            ... обработка прерывания ...&lt;br /&gt;
        after 0 -&amp;gt;&lt;br /&gt;
            ... вызов нового такта цикла обработки ...&lt;br /&gt;
    end.
&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;Это обеспечит проверку на прерывание перед началом каждого такта обработки.
&lt;/p&gt;</description>
</item>
<item>
<title>Cyberon   "Как посылать сообщения?"</title>
<link>http://erlang.dmitriid.com/forum/topic/14#post-44</link>
<pubDate>Thu, 18 Oct 2007 15:53:29 +0000</pubDate>
<dc:creator>Cyberon</dc:creator>
<guid isPermaLink="false">44@http://erlang.dmitriid.com/forum/</guid>
<description>&lt;p&gt;По-моему в примере в ф-и loop1 должна вызываться она сама, а не loop. Все равно не понимаю как процесс, который занимается обработкой будет принимать сообщения, пусть даже и не от сервера, а от функции на своем компьютере.&lt;br /&gt;
Я пишу брутфорсер на ерланге). Понимаю что будут проблемы с производительностью, но это не имеет значения для курсового(все что угодно лишь бы распределенное). Брутфорсер выбрал из-за простоты реализации(произведение матриц намного сложнее).&lt;br /&gt;
Пароли подбираются одновременно к нескольким хешам, с которыми сравниваются хеши подбираемых паролей.&lt;br /&gt;
Вроде продумал протокол. Если клиент нашел пароль, он шлет сообщение серверу {found,Hash,Pass}, а он, в свою очередь, рассылает сообщения другим клиентам что хеш нужно удалить из списков{delHash,Hash,self()}. Если кончился диапазон, клиент также шлет сообщение{notfound,self()} и сервер отвечает новым диапазоном {task,Range,self()}. Нужно, не начиная с начала диапазона, удалить хеш и продолжить перебор. Если вычислителей несколько у каждого нужно укоротить список хешей.
&lt;/p&gt;</description>
</item>
<item>
<title>dmitriid   "Как посылать сообщения?"</title>
<link>http://erlang.dmitriid.com/forum/topic/14#post-43</link>
<pubDate>Thu, 18 Oct 2007 14:27:23 +0000</pubDate>
<dc:creator>dmitriid</dc:creator>
<guid isPermaLink="false">43@http://erlang.dmitriid.com/forum/</guid>
<description>&lt;p&gt;Обработку данных можно также выделить (&lt;code&gt;spawn&lt;/code&gt;) в другой процесс.&lt;/p&gt;
&lt;p&gt;То есть что-то типа&lt;/p&gt;
&lt;pre&gt;
loop() -&amp;gt;
    Pid = spawn(процесс_который_будет заниматься_обработкой),
    loop1(Pid).

loop1(Pid) -&amp;gt;
    receive
        {process, Data} -&amp;gt;
            Pid ! {process, Data},
            loop(Pid);
        {interrupt} -&amp;gt;
            Pid ! {interrupt}
            loop(Pid);
        {exit} -&amp;gt;
            ok
    end
&lt;/pre&gt;</description>
</item>
<item>
<title>Cyberon   "Как посылать сообщения?"</title>
<link>http://erlang.dmitriid.com/forum/topic/14#post-42</link>
<pubDate>Thu, 18 Oct 2007 13:16:03 +0000</pubDate>
<dc:creator>Cyberon</dc:creator>
<guid isPermaLink="false">42@http://erlang.dmitriid.com/forum/</guid>
<description>&lt;p&gt;Пишу курсовой проект по созданию распределенной системы. Сервер должен принимать сообщения о готовности от клиентов, отсылать им данных на обработку, ждать результатов и затем слать новую порцию данных. Сервер может послать клиенту сообщение о том, что часть данных нужно отбросить, в любой момент.&lt;br /&gt;
Собственно проблема, как клиентам во время обработки данных принимать сообщения? Примеры из документации с пинг-понгом и мессенджером не помогают - там ведь процессы занимаются только обработкой сообщений.
&lt;/p&gt;</description>
</item>

</channel>
</rss>
