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

dgsult0t  于 2022-12-16  发布在  Erlang
关注(0)|答案(1)|浏览(190)

我正在尝试创建一个TCP服务器,它将传入的TCP数据包存储为二进制,用于键/值存储。我已经有一个Erlang客户端,它可以将TCP数据包发送到我的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键/值存储(使用ETS)。元组和列表(在本例中)作为这个键/值存储必须能够容纳任何符合erlang的数据类型。
因此,在本例中,ETS表格中当前有1个元素:
| 关键词|价值|
| - ------|- ------|
| {“福”,“巴”}|[“ferwe”,324,{2,“这是一个值”}]|
然后,我希望通过提供Key使用NetCat检索该条目,因此我键入NetCat...

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

My Erlang Server将此消息接收为<<"{\"Foo\",\"Bar\"}\n">> My Erlang Server设置为接收二进制文件,这不是问题。
因此我的问题是,NetCat是否可以用来发送未编码的数据包,这些数据包不会转义引号。这样我的服务器就可以接收到密钥,并且只需〈〈"{“Foo”,“Bar”}“〉
谢谢你。

7bsow1i6

7bsow1i61#

因此,我的问题是,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).

相关问题