ここまできたら、やっぱりSchemeでudpmsgを書かないと。
これは今書いた。CheckenかわいいよChecken。
(use udp)
(define ipmsg-version #x0001)
(define ipmsg-default-port #x0979)
(define ipmsg-sendmsg #x0020)
(define (format-msg num host user cmd extra)
(format "~a:~a:~a:~a:~a:~a" ipmsg-version num host user cmd extra))
(define (send-udpmsg host msg)
(let ((sock (udp-open-socket)))
(udp-bind! sock #f 0)
(udp-connect! sock host 2425)
(udp-send sock (format-msg (random 16777215) "myhost" "myname" ipmsg-sendmsg msg))
(udp-close-socket sock)))
って、3つの中で一番読みやすいな。
せっかくだからErlang版も貼っとく。
じつはずっと昔に書いたコードだったりする。
-module(udpmsg).
-export([send/2]).
-include_lib("kernel/include/inet.hrl").
-define(IPMSG_VERSION, 16#0001).
-define(IPMSG_DEFAULT_PORT, 16#0979).
-define(IPMSG_SENDMSG, 16#020).
-define(DEFAULT_UDP_OPTS, [
{active, false},
% {broadcast, true},
{reuseaddr, true}
]).
send_format(Num, Host, User, Cmd) ->
lists:flatten(io_lib:format("~.10b:~.10b:~s:~s:~.10b:", [?IPMSG_VERSION, Num, User, Host, Cmd])).
send_format(Num, Host, User, Cmd, Extra) ->
lists:flatten(io_lib:format("~.10b:~.10b:~s:~s:~.10b:~s", [?IPMSG_VERSION, Num, User, Host, Cmd, Extra])).
send(Host, Msg) ->
Num = erlang:phash(erlang:localtime(), 16777215),
case gen_udp:open(0, ?DEFAULT_UDP_OPTS) of
{ok, Socket} ->
EntMsg = send_format(Num, "myhost", "myname", ?IPMSG_SENDMSG, Msg),
gen_udp:send(Socket, Host, ?IPMSG_DEFAULT_PORT, EntMsg),
gen_udp:close(Socket);
Error ->
Error
end.
@quek
さんがなにやらスタック型言語を作っていらっしゃるので、
ひさびさにスタック型脳を活性化させました。まる。
ipmsg
にメッセージを送りつけるコード。
xipmsg
のおまけに入っているudpmsgの機能のほんの一部を再現。
$ipmsg_version 16@0001 def
$ipmsg_default_port 16@0979 def
$ipmsg_sendmsg 16@020 def
$format_msg {
$extra exch def $cmd exch def $host exch def $user exch def $num exch def
ipmsg_version <$d 10> outputs `:' num <$d 10> outputs `:' user `:' host `:' cmd <$d 10> outputs `:' extra
10 { cat } repeat
} def
$udpmsg {
$msg exch def $host exch def
$AF_INET $SOCK_DGRAM $udp socket
dup host ipmsg_default_port connect
dup msg send
exch close
} def
realtime srand
`targethost' rand `myname' `myhost' ipmsg_sendmsg `hello,world.' format_msg udpmsg
ってOnyx
って知らない人が多いかも知れないけど、
threadやOOPが扱えるForth型言語。
。
〉
○ノ イヤッホォォ!
<ヽ |
i!i/, |i!ii ガタン
 ̄ ̄ ̄ ̄
これは流行らない。