erlang UDP 测试
来源:互联网 发布:屏幕录像软件 绿色 编辑:程序博客网 时间:2024/06/06 11:44
无意中看到了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.
0 0
- erlang UDP 测试
- erlang 性能亲自测试
- Erlang 性能测试
- erlang --进程生成测试
- erlang 函数测试示例
- Erlang除法性能测试
- erlang mysql 测试
- erlang 简单测试
- Erlang 集群互连测试
- erlang nif 测试
- Erlang 环形基准测试
- erlang 分布测试
- erlang 分布测试【转】
- erlang的dict测试
- erlang gen_server 测试
- 使用Erlang UDP做仿真通信
- Erlang 环形基准测试程序
- erlang节点通信小测试
- uva11762 Race to 1
- UNIX多线程编程(4) 线程私有变量
- 自定义流式布局
- datatables 通过object加载DT
- ios 监测网络状态
- erlang UDP 测试
- 五个小案例带你学习火热的Vue.js
- svn更新含义
- JNI异常: java.lang.UnsatisfiedLinkError: dlopen failed: ***.so: has text relocations
- MmGetSystemRoutineAddress实现
- Steps POJ - 2590(数学推导???规律吧!!!)
- centos7下开放指定端口
- Android 浮点型当小数点后为0时自动去掉
- linux ubuntu 无法获得锁解决办法