使用 NetCat 将原始 Tcp 数据包发送到 Erlang 服务器

Sending Raw Tcp Packet Using NetCat to Erlang Server

我正在尝试创建一个 TCP 服务器,它将传入的 TCP 数据包存储为二进制文件,用于 Key/Value 存储。我已经有一个可以将 TCP 数据包发送到我的 Erlang 服务器的 Erlang 客户端,但是为了完整起见,我想允许用户使用 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 客户端使用键 {"Foo","Bar"} 和值 ["ferwe",324,{2,"this is a value"}] 预填充 erlang key/value 存储(使用 ETS)。分别是元组和列表(在此示例中),因为此 key/value 存储必须能够容纳任何符合 erlang 的数据类型。

因此在示例中,当前 ETS 中有 1 个元素 table:

Key Value
{"Foo","Bar"} ["ferwe",324,{2,"this is a value"}]

然后我想通过提供密钥使用 NetCat 检索该条目,所以我输入 NetCat...

$ nc localhost 8091
get:key:{"Foo","Bar"}

我的 Erlang 服务器收到此 <<"{\"Foo\",\"Bar\"}\n">> 我的 Erlang 服务器设置为接收二进制文件,这不是问题。

因此,我的问题是,NetCat 能否用于发送未转义引号的未编码数据包。 这样我的服务器就能够接收密钥并且只是 <<"{"Foo","Bar"}">>

谢谢。

My question is therefore, can NetCat be used to send unencoded Packets which doesn't escape the quote marks.

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

Such that my Server is able to receive the Key and just <<"{"Foo","Bar"}">>

<<"{"Foo","Bar"}">> 不是句法正确的 Erlang 术语。您想获取元组 {"Foo","Bar"},以便在 ETS table 中查找它吗?您可以通过解析二进制文件来做到这一点:

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).