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