使用 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).
我正在尝试创建一个 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).