%% ---
%%  Excerpted from "Programming Erlang",
%%  published by The Pragmatic Bookshelf.
%%  Copyrights apply to this code. It may not be used to create training material,
%%  courses, books, articles, and the like. Contact us if you are in doubt.
%%  We make no guarantees that this code is fit for any purpose.
%%  Visit http://www.pragmaticprogrammer.com/titles/jaerlang for more book information.
%%  
%%  日本語版の『プログラミングErlang』、およびサンプルコードについては、
%%   http://ssl.ohmsha.co.jp/cgi-bin/menu.cgi?ISBN=978-4-274-06714-3 を確認してください。
%% ---
% http://www-net.cs.umass.edu/cs653-1997/notes/ch3/ch3-1.html

%% http://www.ibrado.com/sock-faq/
%% http://docs.sun.com/db?q=sockets&p=/doc/802-5886/6i9k5sgso&a=view

%% ソケットに関するFAQ
                                                       
%% Messages sent by datagram sockets can be broadcast to reach all 
%% of the hosts on an attached network. The network must support broadcast; 
%% the system provides no simulation of broadcast in software. 
%% Broadcast messages can place a high load on a network since they 
%% force every host on the network to service them. 
%% Broadcasting is usually used for either of two reasons: to find 
%% a resource on a local network without having its address, 
%% or functions like routing require that information be sent to all 
%% accessible neighbors.
%%
%%       To send a broadcast message, create an Internet datagram socket:
%%
%%              s = socket(AF_INET, SOCK_DGRAM, 0);
%%
%%       and bind a port number to the socket:
%%
%%              sin.sin_family = AF_INET;
%%              sin.sin_addr.s_addr = htonl(INADDR_ANY);
%%              sin.sin_port = htons(MYPORT);
%%              bind(s, (struct sockaddr *) &sin, sizeof sin);
%%
%%   The datagram can be broadcast on only one network by sending 
%% to the network's broadcast address. A datagram can also be broadcast 
%% on all attached networks by sending to the special address 
%% INADDR_BROADCAST, defined in <netinet/in.h>.
%% データグラムソケットから送られるメッセージは、接続されたネットワークの全ホストに
%% 届くようにブロードキャストできる。ネットワークはブロードキャストをサポートしている
%% 必要がある。システムはブロードキャストをソフトウェアでシミュレートしない。
%% ブロードキャストメッセージはネットワークの各ホストが処理しなければならないため、
%% ネットワークに大きな負荷をかける場合がある。
%% 一般にブロードキャストは以下の2つの用途で使われる：
%% アドレスが不明なリソースをローカルネットワークから発見するため。
%% アクセス可能なすべての近隣ホストに情報を送る必要があるルーティングなどの機能のため。
%% 
%%       ブロードキャストメッセージを送るには、Internetデータグラムソケットを作る：
%%
%%              s = socket(AF_INET, SOCK_DGRAM, 0);
%%
%%       そして、そのソケットとポート番号をバインドする：
%%
%%              sin.sin_family = AF_INET;
%%              sin.sin_addr.s_addr = htonl(INADDR_ANY);
%%              sin.sin_port = htons(MYPORT);
%%              bind(s, (struct sockaddr *) &sin, sizeof sin);
%%
%%   データグラムをネットワークのブロードキャストアドレスに送ることによって、その
%% ネットワーク1つだけにおいてデータグラムをブロードキャストできる。また、接続されて
%% いるすべてのネットワークにデータグラムをブロードキャストするには、<netinet/in.h>
%% で定義されている特別なアドレスINADDR_BROADCASTにデータグラムを送る。


-module(broadcast).
-compile(export_all).

send(IoList) ->
    case inet:ifget("eth0", [broadaddr]) of
	{ok, [{broadaddr, Ip}]} ->
	    {ok, S} =  gen_udp:open(5010, [{broadcast, true}]),
	    gen_udp:send(S, Ip, 6000, IoList),
	    gen_udp:close(S);
	_ ->
	    io:format("Bad interface name, or\n"
		      "broadcasting not supported\n")
    end.

listen() ->
    {ok, S} = gen_udp:open(6000),
    loop(S).

loop(S) ->
    receive
	Any ->
	    io:format("received:~p~n", [Any]),
	    loop(S)
    end.


