インターネット経由でパケットを送信するための簡単なテストとして、次のコードを使用してみました。localhost のバージョンが次のコマンドで機能するかどうかを確認しましたが、機能しましたが、localhost (127.0.0.1) を実際のインターネット アドレス (私のもの) に置き換えても機能しません。クライアント側で 0 を取得するだけで、サーバー側では何も変わりませんが、localhost の使用はサーバー側でも同じです。
サーバ側:
udp_test:start_server().
クライアント側:
udp_test:client(40).
十分に単純ですが、127.0.0.1を自分のIPアドレスに置き換えると、何も得られません(ファイアウォールもオフにしました)。私のホーム ネットワークの基本的なトポロジはワイヤレス モデム (DSL を使用) で構成され、コンピューターはワイヤレス USB カードを介して接続されています。ネットワーク上には他に約 2 台のアクティブなコンピューターがあります。関係があるのかもしれないと思いました。
また、コードを変更してudp_test:client(40,127.0.0.1).
代わりに入力し、udp_test で 2 つの引数を受け入れるようにクライアント関数を変更するにはどうすればよいでしょうか? 私は単純client(N,ip)
に関数を実行して変更しようとgen_udp:send(Socket, "ip",,)
しましたが、それは一致する句のエラーが発生しませんでした。
-module(udp_test).
-export([start_server/0, client/1]).
start_server() ->
spawn(fun() -> server(4000) end).
%% The server
server(Port) ->
{ok, Socket} = gen_udp:open(Port, [binary]),
io:format("server opened socket:~p~n",[Socket]),
loop(Socket).
loop(Socket) ->
receive
{udp, Socket, Host, Port, Bin} = Msg ->
io:format("server received:~p~n",[Msg]),
N = binary_to_term(Bin),
Fac = fac(N),
gen_udp:send(Socket, Host, Port, term_to_binary(Fac)),
loop(Socket)
end.
fac(0) -> 1;
fac(N) -> N * fac(N-1).
%% The client
client(N) ->
{ok, Socket} = gen_udp:open(0, [binary]),
io:format("client opened socket=~p~n",[Socket]),
ok = gen_udp:send(Socket, "127.0.0.1", 4000,
term_to_binary(N)),
Value = receive
{udp, Socket, _, _, Bin} = Msg ->
io:format("client received:~p~n",[Msg]),
binary_to_term(Bin)
after 2000 ->
0
end,
gen_udp:close(Socket),
Value.