使用NetCat向Erlang Server发送原始Tcp报文



我正在尝试创建一个TCP服务器,它将存储传入的TCP数据包为二进制,用于键/值存储。我已经有了一个Erlang客户端,它可以向我的Erlang服务器发送TCP数据包,但是为了完整起见,我希望允许用户使用NetCat等客户端从命令行发送TCP数据包。用户将遵守如何格式化TCP数据包中的数据的规范,以便服务器能够理解它。例如

$ nc localhost 8091
add:key:testKey
Key Saved!
add:value:testValue
Value Saved!
get:key:testKey
Value: testValue

用户通过add:key/value:get:key:与服务器交互。之后的内容应该按字面意思传递给服务器。这意味着如果用户愿意,这样的情况是可能的。

$ nc localhost 8091
add:key:{"Foo","Bar"}
Key Saved!
add:value:["ferwe",324,{2,"this is a value"}]
Value Saved!
get:key:{"Foo","Bar"}
Value: ["ferwe",324,{2,"this is a value"}]

然而,这似乎是不可能的,因为实际发生的情况如下…

我将使用我的erlang客户端预先填充erlang键/值存储(使用ETS),键为{"Foo","Bar"},值为["ferwe",324,{2,"this is a value"}]。元组和列表(在本例中)作为键/值存储必须能够容纳任何erlang兼容的数据类型。

所以在这个例子中,目前在ETS表中有一个元素:

<表类>键值tbody><<tr>{"Foo","Bar"(324年"ferwe"{2,"这是一个value"}]

因此,我的问题是,NetCat可以用来发送不转义引号的未编码数据包吗?

是的,netcat发送的正是你给它的,所以在这种情况下,它发送的get:key:{"Foo","Bar"}没有转义引号。

这样我的服务器就能够接收到密钥和<<"{"Foo","Bar"}">>

<<"{"Foo","Bar"}">>不是一个语法正确的Erlang术语。您想要获得元组{"Foo","Bar"},而不是为了在ETS表中查找它?您可以通过解析二进制文件来实现:

Bin = <<"{"Foo","Bar"}n">>,
%% need to add a dot at the end for erl_parse
{ok, Tokens, _} = erl_scan:string(binary_to_list(Bin) ++ "."),
{ok, Term} = erl_parse:parse_term(Tokens),
ets:lookup(my_table, Term).

最新更新