Erlangで毒電波送信

お久しぶりです。zickです。
数日前、『Lispの歌』という言葉を目にし、一体何なのかと思ったら、
『かっこうの歌』のことだったんですね。(「かっこう→括弧」という洒落)
某所でネタとしてLisperが実際に歌った由緒正しきモノだそうです。

話は変わりますが、相変わらずErlang触ってます。
それで、今はソケットの勉強をしているのですが、
練習という名目で毒電波(SSTP)を飛ばしてみました。

即席で作った怪しげなスクリプトを読み込んで、それに基づいてErlangがSSTPを飛ばします。
毒電波を飛ばしているErlangの関数はこんな感じです。

send_and_receive(Str) ->
{ok,Sock} = gen_tcp:connect("localhost", 9801, [binary, {packet, 0}]),
ok = gen_tcp:send(Sock, Str),
receive_data(Sock, []).
receive_data(Sock, SoFar) ->
receive
{tcp,Sock,Bin} ->
receive_data(Sock, [Bin|SoFar]);
{tcp_closed,Sock} ->
list_to_binary(lists:reverse(SoFar))
end.
send_sstp(Body, Ver, Retry) ->
Header = "SEND SSTP/"++Ver++"\r\n"
"Sender: "++?SENDER++"\r\n"
++Body++
"Charset: "++?CHAR_SET++"\r\n\r\n",
case {Retry, send_and_receive(Header)} of
{true, <<"SSTP/1.1 409",_/binary>>} ->
timer:sleep(2000),
send_sstp(Body, Ver, Retry);
{_, Any} ->
Any
end.

怪しげなスクリプトはこんな感じ。

%ラベルは*から始まり、命令は^から始まります
%字句は全て改行区切りという不気味な作りです(笑)
*start
\h\s0電波、\w8届いた?
届いた
届いてない
わからない
^list_speak
届いた
arrive
^eq_jump
わからない
not_understand
^eq_jump
\h\s0それじゃあ、もう一度送るね\w8…\w8…そりゃ!
^next_speak
start
^jump
*arrive
\u\s0いや、むしろErlangから毒電波がこっちに届いてるんだけど
^normal_speak
^exit
*not_understand
\h\s0聞くは一時の恥、聞かぬは一生の恥。わからないことは悪いことじゃないよ\uどーでもいい\e
^normal_speak
^exit

Leave a Reply