erlang UDP 测试

无意中看到了stackoverflow.com 中提出的有关erlang UDP收发数据的问题,自己也一知半解,故直接敲代码重现问题以便修正。

stackoverflow.com 中有问题代码:

-module(udp_test).

-export([start_client/3, listen/1, send/4, start_listen/1]).

start_client(Host, Port, Packet) ->
    {ok, Socket} = gen_udp:open(0, [{active, true}, binary]),
    io:format("client opened socket=~p~n",[Socket]),
    spawn(?MODULE, send, [Socket, Host, Port, Packet]).

start_listen(Port) ->
    {ok, Socket} = gen_udp:open(Port, [binary]),
    spawn(?MODULE, listen, [Socket]).

listen(Socket) ->
    inet:setopts(Socket, [{active, once}]),
    receive
    {udp, Socket , Host, Port, Bin} ->
        gen_udp:send(Socket, Host, Port, "Got Message"),
        io:format("server received:~p / ~p~n",[Socket, Bin]),
        listen(Socket)
    end.

send(Socket, Host, Port, Packet) ->
    timer:send_after(1000, tryToSend),
    receive
    tryToSend ->
        io:fwrite("Sending: ~p / to ~p / P: ~p~n", [Packet, Host, Port]),
        Val = gen_udp:send(Socket, Host, Port, Packet),
        io:fwrite("Value: ~p~n", [Val]),
        send(Socket, Host, Port, Packet);
    _ ->
        io:fwrite("???~n")
    end.

出现的问题是:应用程序中,以下两句代码并未执行。

gen_udp:send(Socket, Host, Port, "Got Message"),
        io:format("server received:~p / ~p~n",[Socket, Bin]),
帖子给出的回答是:

 
 
  • For each loop it opens a new socket, the first time it uses the port to open the socket while in the following loops it uses the socket to open a new socket, which should generate an error.
  • You set the socket to {active,once} so you will at most receive one packet on the socket before you reset it to being active once.
经过修正,给出正确的代码如下:
-module(udp_test2).


-export([server/0,start_server/0,listen/1,client/1,start_client/1, send/4]).


server() ->
	spawn(?MODULE,start_server,[]).


start_server() ->
    {ok, Socket} = gen_udp:open(4000, [binary]),
    listen(Socket).


listen(Socket) ->
    inet:setopts(Socket, [{active, once}]),
    receive
    {udp, Socket , Host, Port, Bin} ->
        gen_udp:send(Socket, Host, Port, Bin),
        io:format("server received message:~p / ~p~n",[Socket, Bin]),
        listen(Socket)
    end.


client(Msg) ->
	spawn(?MODULE,start_client,[Msg]).


start_client(Msg) ->
    {ok, Socket} = gen_udp:open(0, [{active, true}, binary]),
    io:format("client opened socket=~p~n",[Socket]),
    send(Socket, "127.0.0.1", 4000, Msg).


send(Socket, Host, Port, Msg) ->
    timer:send_after(1000, tryToSend),
    receive
    	tryToSend ->
        	io:fwrite("~nSending: ~p / to ~p / P: ~p~n", [Msg, Host, Port]),
        	gen_udp:send(Socket, Host, Port, Msg),
        	send(Socket, Host, Port, Msg);
    	{udp,Socket,_,_,Bin} ->
        	io:fwrite("client received message: ~p / ~p~n",[Socket,Bin])
    end.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值