使用Netcat或Rails通过TCP / IP发送数据

时间:2017-04-13 09:46:33

标签: ruby-on-rails sockets tcp-ip netcat

我有一个服务器IP和一个端口,我可以在Ubuntu 14.04上通过nc连接。

> nc x.x.x.x PORT

为了与服务器通信,第一步是发送WAKEUP呼叫并获得确认。服务器在唤醒调用中需要3个字节的ID。文档中提供了一个示例,其中显示了使用软件发送ID和接收ack的成功方案。即

客户发送:

<sy><sy><eq>111<et>

服务器响应:

<sy><ak>A<et><cr>

以下是<sy>

的一些细节
  

在&lt;&gt;内括号是不可打印的ASCII字符(<sy> = ASCII 22或Hex 0x16)

我试图复制完全相同的情况但未能这样做。虽然在那里接收了数据,但服务器不响应我发送的数据。我不确定这些代码<sy><sy><eq>等。如何正确发送ID(111)以及这些代码<sy>

还尝试使用Rails框架和Bindata ruby​​ gem发送此数据,但不知道如何表示上述格式。

1 个答案:

答案 0 :(得分:1)

netcat可能是错误的工具。或者至少你会想要使用其他程序来输入它。

如果我这样做,我会在python或C中编写一些代码,这些内容既可以连接到服务器,也可以提供发送它所需的任何数据(并接收/解释响应),而忽略nc共。网上有很多例子。

您可以使用b'\x16'字符的语法<sy>对python中的字节字符串中的控制字符进行编码。大多数其他语言都具有相同的功能。

我无法确切知道这些角色是什么。它们似乎是标准的ASCII控制字符,但它们并没有使用标准缩写(例如,请参阅http://www.theasciicode.com.ar/)。因此,您正在查看的文档可能包含相应值的列表。假设为了示例,<eq>对应于ASCII ENQ字符,<et>对应于ASCII EOT(并且已经知道<sy>等同于ASCII SYN),您想要的字符串<sy><sy><eq>111<et>可以用python字节字符串编码:b'\x16\x16\x05111\x04'

(或等效b'\x16\x16\x05\x31\x31\x31\x04'如果您喜欢规律性:1字符只是ASCII数字,因此您可以将每个1替换为其二进制等效b'\x31'

要返回nc,尝试从终端窗口输入控制字符到nc输入,虽然在大多数情况下可能非常困难且容易出错。您将需要知道等效的控制字符映射(例如,0x16是&#34; Ctrl-V&#34;)并且需要知道如何让终端接受该文字字符(巧合的是,在linux中,你有使用Ctrl-V在大多数控制字符之前输入它们以避免以通常的方式解释它们:Ctrl-D == EOF,Ctrl-C == Interrupt,Ctrl-W == Delete-Previous- Word等。)

因此,如果您想从命令行输入上面的数据到nc的输入,您需要输入以下字符:

Ctrl-V Ctrl-V              <sy> / SYN
Ctrl-V Ctrl-V              <sy> / SYN
Ctrl-V Ctrl-E              <eq> / ENQ
1
1
1
Ctrl-V Ctrl-D              <et> / EOT

但值得注意的是,通常nc在您输入换行符之前不会发送任何内容(即按回车键)。然后,该换行符也将被发送到服务器,这可能不是您想要的。