我在Ubuntu机器上使用bash命令来控制测量仪器。两台机器都连接到同一个LAN。测量仪器在TCP端口5025上侦听SCPI命令。标准测试 - 询问仪器的ID - 效果很好:
mjh@Ubuntu:~$ echo "*IDN?" | netcat 192.168.0.10 5025
Rohde&Schwarz,ZVL-3,12345
但是当我查询数据时(我期望1818个ASCII字符),netcat立即返回:
mjh@Ubuntu:~$ echo "TRAC? TRACE1" | netcat 192.168.0.10 5025
mjh@Ubuntu:~$
但是,我可以在交互式telnet会话中查询数据而不会出现问题:
mjh@Ubuntu:~$ telnet 192.168.0.10 5025
Trying 192.168.0.10...
Connected to 192.168.0.10.
Escape character is '^]'.
TRAC? TRACE1
-6.993319702E+001,-6.755982208E+001, ... (1818 chars in total)
我想在脚本中使用这些命令,这就是我想使用netcat的原因。
我怎样才能找出为什么telnet有效并且netcat没有?可能是大包装尺寸?
到目前为止,我(未成功)尝试了以下内容:
netcat -C
用于CRLF作为行结尾netcat -t
获取更多telnet兼容性netcat -u
答案 0 :(得分:0)
Netcat和telnet以不同方式处理连接。
<强>的Telnet 强>
<强> Netcat的强>
具体来说,当使用netcat查询ID时,仪器会立即在其ACK
内返回ID。但是在询问数据时,仪器需要更长的时间才能获取数据,仪器中的网络适配器会在数据发送之前关闭连接。
评论建议使用这些工具,但这不是微不足道的,所以我将深入研究一般程序:
在Ubuntu机器上,安装tcpdump
sudo apt-get install tcpdump
找到您的网络适配器的ID(查找eth0,eth1或任何提醒您网络适配器的内容。在我的情况下,我获得了eth1。)
sudo tcpdump -D
捕获所有来自或来自端口5025(SCPI端口)的流量。 s0选项告诉tcpdump捕获整个包,而不仅仅是前几个字节。 -w选项使tcpdump将原始数据保存到文件中。
sudo tcpdump -i eth1 -s0 port 5025 -w netcat_trac.dump
打开第二个终端窗口并执行netcat命令(或telnet会话):
echo "TRAC? TRACE1" | netcat 192.168.0.10 5025
在第一个终端窗口中,按CTRL+C
对几种不同的风格重复此操作,每次都将输出保存到不同的.dump文件中。
在任何带有GUI的PC上(Windows,在我的情况下,但也适用于Ubuntu),安装Wireshark并查看.dump文件。
注意SYN
系列{&#34;我想建立联系&#34;),SYN+ACK
(&#34;我理解你,也想要与你建立联系&#34;),FIN+ACK
(我想停止与你交谈)捕获数据包中的标志。比较这些标志在不同方案中的显示顺序。如果您不知道这意味着什么,this is a great introduction。 (如果你想了解粗略的细节,也要注意&#34; seq&#34;和#34; ack&#34;数字。)
使用-q开关告诉netcat在关闭连接之前等待。
echo "TRAC? TRACE1" | netcat -q 1 192.168.0.10 5025
在上面的命令中,等待时间是1秒。
我确信有更好的解决方案(等待设置为PSH
的数据包而不是可能太短或太长的固定时间),但这对我来说效果不错。