小编Erl*_*abe的帖子

gen_server:调用未注册的全局名称

我有一个gen_server注册全局名称的过程,如下所示:

global:register_name(<<"CLIENT_", NAME/binary>>, self()),
Run Code Online (Sandbox Code Playgroud)

gen_server:call另一个进程正在尝试使用如下方式向该进程发送消息:

 gen_server:call({global, <<"CLIENT_", NAME/binary>>}, {msg, DATA}),
Run Code Online (Sandbox Code Playgroud)

如果第二次调用发生在第一个进程注册全局名称之前,它将终止并显示:

exit with reason {noproc,{gen_server,call,[{global,<<"CLIENT_122">>},{msg, <<"TEST">>}]}}
Run Code Online (Sandbox Code Playgroud)

仅当全局名称已注册时才进行调用,如果不是则执行其他操作的正确方法是什么?

erlang erlang-otp gen-server

5
推荐指数
1
解决办法
759
查看次数

Erlang:变量是未绑定的

为什么以下说变量未绑定?

9> {<<A:Length/binary, Rest/binary>>, Length} = {<<1,2,3,4,5>>, 3}.     
* 1: variable 'Length' is unbound
Run Code Online (Sandbox Code Playgroud)

很明显Length应该是3.

我试图有一个类似模式匹配的功能,即:

parse(<<Body:Length/binary, Rest/binary>>, Length) ->
Run Code Online (Sandbox Code Playgroud)

但如果失败的原因相同.如何实现我想要的模式匹配?


我真正想要实现的是将传入的tcp流包解析为LTV(长度,类型,值).

在我解析长度和类型后的某个时刻,我想只准备多达Length字节数作为值,因为其余的可能是下一个LTV.

所以我的parse_value功能是这样的:

parse_value(Value0, Left, Callback = {Module, Function},
       {length, Length, type, Type, value, Value1}) when byte_size(Value0) >= Left ->
    <<Value2:Left/binary, Rest/binary>> = Value0,
    Module:Function({length, Length, type, Type, value, lists:reverse([Value2 | Value1])}),
    if 
    Rest =:= <<>> ->
        {?MODULE, parse, {}};
    true ->
        parse(Rest, Callback, {})
    end;
parse_value(Value0, Left, _, {length, Length, type, Type, …
Run Code Online (Sandbox Code Playgroud)

erlang

5
推荐指数
1
解决办法
1289
查看次数

标签 统计

erlang ×2

erlang-otp ×1

gen-server ×1