<?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 по-русски. Форум Тема: Проблемма с gen_tcp</title>
<link>http://erlang.dmitriid.com/forum/</link>
<description>Erlang по-русски. Форум Тема: Проблемма с gen_tcp</description>
<language>en</language>
<pubDate>Tue, 18 Nov 2008 04:35:31 +0000</pubDate>

<item>
<title>architect   "Проблемма с gen_tcp"</title>
<link>http://erlang.dmitriid.com/forum/topic/13#post-47</link>
<pubDate>Sat, 20 Oct 2007 16:19:32 +0000</pubDate>
<dc:creator>architect</dc:creator>
<guid isPermaLink="false">47@http://erlang.dmitriid.com/forum/</guid>
<description>&lt;p&gt;Работает! Спасибо!
&lt;/p&gt;</description>
</item>
<item>
<title>dmitriid   "Проблемма с gen_tcp"</title>
<link>http://erlang.dmitriid.com/forum/topic/13#post-46</link>
<pubDate>Sat, 20 Oct 2007 10:20:59 +0000</pubDate>
<dc:creator>dmitriid</dc:creator>
<guid isPermaLink="false">46@http://erlang.dmitriid.com/forum/</guid>
<description>&lt;p&gt;Прошу прощения за долгое молчание&lt;/p&gt;
&lt;p&gt;В общем, ответ здесь: &lt;a href=&quot;http://rsdn.ru/forum/message/2699995.1.aspx&quot;&gt;http://rsdn.ru/forum/message/2699995.1.aspx&lt;/a&gt; и более простой вариант здесь: &lt;a href=&quot;http://rsdn.ru/forum/message/2700003.1.aspx&quot;&gt;http://rsdn.ru/forum/message/2700003.1.aspx&lt;/a&gt;
&lt;/p&gt;</description>
</item>
<item>
<title>architect   "Проблемма с gen_tcp"</title>
<link>http://erlang.dmitriid.com/forum/topic/13#post-41</link>
<pubDate>Sat, 13 Oct 2007 14:37:48 +0000</pubDate>
<dc:creator>architect</dc:creator>
<guid isPermaLink="false">41@http://erlang.dmitriid.com/forum/</guid>
<description>&lt;p&gt;В опциях сокета стоит только binary.
&lt;/p&gt;</description>
</item>
<item>
<title>architect   "Проблемма с gen_tcp"</title>
<link>http://erlang.dmitriid.com/forum/topic/13#post-40</link>
<pubDate>Sat, 13 Oct 2007 14:26:30 +0000</pubDate>
<dc:creator>architect</dc:creator>
<guid isPermaLink="false">40@http://erlang.dmitriid.com/forum/</guid>
<description>&lt;p&gt;Сделал небольшой тестовый пример:&lt;/p&gt;
&lt;pre&gt;
-module(t).

-export([
	s/0,
    s/1,
    t/1
]).

-define(SPORT, 54321).

s() -&amp;gt;
    case gen_tcp:listen(?SPORT, [binary]) of
        {ok, LS} -&amp;gt;
            s(LS);
        Err -&amp;gt;
            io:format(\&quot;Server listen error: ~p~n\&quot;, [Err])
        end.

s(LSock) -&amp;gt;
    case gen_tcp:accept(LSock) of
        {ok, Sock} -&amp;gt;
            io:format(\&quot;Accept connection: ~p~n\&quot;, [Sock]),
            spawn(?MODULE, s, [LSock]),
            sl(Sock);
        Err -&amp;gt;
            io:format(\&quot;Server accept error: ~p~n\&quot;, [Err])
        end.

sl(Sock) -&amp;gt;
    receive
       {tcp, Sock, Data} -&amp;gt;
           Disp = binary_to_term(Data),
           io:format(\&quot;Receive data: ~p~n\&quot;, [Disp]),
           sl(Sock);
       All -&amp;gt;
           io:format(\&quot;Catch undef data on server: ~p~n\&quot;, [All]),
           sl(Sock)
       after 10000 -&amp;gt;
           Ret = gen_tcp:close(Sock),
           io:format(\&quot;Connection ~p close.... ~p~n\&quot;, [Sock, Ret])
       end.           

t(N) -&amp;gt;
    case gen_tcp:connect(\&quot;localhost\&quot;, ?SPORT, [binary]) of
        {ok, Sock} -&amp;gt;
            msg(Sock, N);
        Err -&amp;gt;
            io:format(\&quot;Client connect error: ~p~n\&quot;, [Err])
        end.

msg(_, 0) -&amp;gt;
    io:format(\&quot;All test done~n\&quot;);

msg(S, N) -&amp;gt;
    gen_tcp:send(S, term_to_binary(\&quot;caramba\&quot;)),
    gen_tcp:send(S, term_to_binary(N)),
    io:format(\&quot;Message ~p send~n\&quot;, [N]),
    NN = N - 1,
    msg(S, NN).
&lt;/pre&gt;
&lt;p&gt;Тут s() запускеает сервак который слушает порт, устанавливает соединение и просто распечатывает принимаемые сообщения. t(N) это тестовый клиент - соединяется с серваком и отправляет ему N * 2 пакетов: в первом строка &quot;caramba&quot;, а во втором номер сообщения. Проблемма в том что код не работает.&lt;br /&gt;
Запускаю в 2-х окнах на локальной машине.&lt;br /&gt;
Клиент:&lt;/p&gt;
&lt;pre&gt;
Erlang (BEAM) emulator version 5.5.5 [async-threads:0]

Eshell V5.5.5  (abort with ^G)
1&amp;gt; t:t(10).
Message 10 send
Message 9 send
Message 8 send
Message 7 send
Message 6 send
Message 5 send
Message 4 send
Message 3 send
Message 2 send
Message 1 send
All test done
ok
2&amp;gt;
&lt;/pre&gt;
&lt;p&gt;Сервер:&lt;/p&gt;
&lt;pre&gt;
Erlang (BEAM) emulator version 5.5.5 [async-threads:0]

Eshell V5.5.5  (abort with ^G)
1&amp;gt; t:s().
Accept connection: #Port&amp;lt;0.98&amp;gt;
Receive data: \&quot;caramba\&quot;
Receive data: \&quot;caramba\&quot;
Receive data: \&quot;caramba\&quot;
Receive data: \&quot;caramba\&quot;
Receive data: \&quot;caramba\&quot;
Receive data: \&quot;caramba\&quot;
Receive data: \&quot;caramba\&quot;
Receive data: 2
Receive data: \&quot;caramba\&quot;
Connection #Port&amp;lt;0.98&amp;gt; close.... ok
ok
2&amp;gt;
&lt;/pre&gt;
&lt;p&gt;Как видно сервер не принимает часть пакетов. Всего один раз он смог принять номер сообщения и только 8 раз из 10 успел принять строку. Хотя TCP гарантирует что пакеты придут в правильном порядке. Когда ставлю задержку между отправкой пакетов на клиенте - сервер начинает их правильно принимать. Что это? Баг в библиотеке gen_tcp или я что-то не так делаю? Можен настроить надо ещё что?
&lt;/p&gt;</description>
</item>

</channel>
</rss>
