そこで、Cで書いたものと(ほとんど)同じものをErlangで書いた。
動作の概要を以下にイメージ図で示す。
client が一回だけ server に接続して、送られてきたデータ(Hello)を表示するだけのもの。
以下にErlangのソースを示す。
□client
-module( sock_client ).
-compile( export_all ).
client() ->
%% サーバ接続先
Server = "localhost",
%% サーバに接続
{ ok, Sock } = gen_tcp:connect( Server,
12345,
[ binary, { packet, 0} ] ),
%% サーバからデータ受信
receive
{ tcp, Sock, Bin } ->
io:format( "Client get:~p~n", [ binary:bin_to_list( Bin ) ] )
end,
%% ソケットの終了
gen_tcp:close( Sock ).
□server
-module( sock_server ).
-compile( export_all ).
server() ->
%% TCPクライアントからの接続要求を待てる状態
{ ok, LSock } = gen_tcp:listen( 12345, [ binary, { packet, 0 } ] ),
%% TCPクライアントからの接続要求を受け付ける
{ ok, ASock } = gen_tcp:accept( LSock ),
%% 送信
gen_tcp:send( ASock, "Hello" ),
%% TCPセッション終了
ok = gen_tcp:close( ASock ).
server を先に実行しておいてから client を実行する。
そうすると
Client get:"Hello"
と表示されるはず。
参考:
Geekなぺーじ:TCPを使う : http://www.geekpage.jp/programming/linux-network/tcp-1.php
gen_tcp / Erlang World : http://erlangworld.web.fc2.com/distributed_programming/gen_tcp.html
Erlang -- gen_tcp : http://www.erlang.org/doc/man/gen_tcp.html