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