相关疑难解决方法(0)

将erlang术语转换为字符串,或解码erlang二进制文件

我有一个生成数据的erlang程序.需要将此数据通过udp传输到非erlang程序以进行进一步处理.我已经有了这个部分 - 通过udp发送数据并在另一个非erlang端接收它.

这是问题所在.数据(像包含列表的元组一样的erlang术语)似乎不能"按原样"过去(即我不能只发送任意的erlang术语).显然需要先将其转换为文本或二进制文件.转换为二进制似乎很容易,我发现bif.问题是,二进制gobbledygook出现在另一边,我不知道任何简单的解码方法(另一方面是非erlang).

除非有人告诉我一些简单的方法来二进制官样文章的另一边进行解码,我想的要发送的数据为条件的简单字符串表示 - 例如像这样的元组:

{[1,2,3],[4,5,6]}
Run Code Online (Sandbox Code Playgroud)

像这样发送:

"{[1,2,3],[4,5,6]}"
Run Code Online (Sandbox Code Playgroud)

我没有看到任何这样的bif,即"convert_term_to_ascii/1"等.我知道我可以扫描它并发送条款的令牌表示,但我不想这样做 - 解码另一方面只是一个痛苦我不想处理.

我知道我不是第一个,第二个或第三个遇到这个问题的人.它必须相当普遍.通常如何处理?

有人能指出我一些资源,告诉我如何1)将二进制gobbledygook转换为ascii(在非erlang方面需要),或者2)直接将术语转换为字符串(在erlang方面需要)?

或者,告诉我我是怎么错的,我该怎么做呢?

谢谢.

erlang

22
推荐指数
1
解决办法
1万
查看次数

Erlang:找到我的IP地址

我正在尝试使用Redis为某些部分完成Load Balancer /登录服务器/游戏服务器设置.负载平衡就是其中之一.在我的Redis负载平衡实例中,我正在使用有序集.关键是应用程序名称,成员是游戏服务器的IP地址.

这就是我的问题.我想在erlang中使用一个公共方法.我找不到符合我需求的东西.我想知道我是不是在寻找一些东西.

{ok, L} = inet:getif(),
IP = element(1, hd(L)),
Run Code Online (Sandbox Code Playgroud)

给我我正在寻找的东西.我相信目前是{192,168,0,14}.但功能不是"公开的".

{ok, Socket} = gen_tcp:listen(?PORT_LISTEN_GAME, [{active,once}, {reuseaddr, true}]),
{ok, {IP, _} = inet:sockname(Socket),
Run Code Online (Sandbox Code Playgroud)

给了我{0,0,0,0}.我试过inet:getaddr("owl")这个给了我{127,0,1,1}.

我是否仅限于通过TCP发送消息并使用inet:peername(Socket)?看起来很像是为了让事情变得如此简单.我的应用程序的所有不同部分都在同一台计算机上运行以进行测试.是否会让我回到{127,0,0,1}?那不行.我需要将IP发送回用户(我的手机),以便他们可以与正确的服务器连接.环回不会......

现行守则

我要感谢所有的回复.是的,我注意到Lol4t0在新年之后的评论.所以我改变了我的代码来反映这一点.为像我这样的慢人发布这个.我必须让我的大脑陷入困境才能让这些东西被点击.

hd([Addr || {_, Opts} <- Addrs,
    {addr, Addr} <- Opts,
    {flags, Flags} <- Opts,
    lists:member(loopback,Flags) =/= true]).
Run Code Online (Sandbox Code Playgroud)

erlang

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

标签 统计

erlang ×2