我使用bash命令的Ubuntu机上用于控制测量仪器。 这两种机器都连接到相同的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
出于绝望
根本原因
Netcat的和telnet处理连接不同。
远程登录
- 建立与仪器的TCP连接
- 当用户输入数据时,将其发送到仪器(在此情况下“TRAC?TRACE1”)
- 从仪器接收数据(多个数据包,如果需要的话)
- 当用户结束交互式会话,用仪器靠近TCP连接
- 退出程序
Netcat的
- 建立与仪器的TCP连接
- 发送由管道输送到netcat的数据(在这种情况下,“TRAC?TRACE1”)
- 立即请求连接将被终止
- 接收的任何数据的仪器挤过
- 退出节目后仪器确认并完成TCP连接的关闭。
具体而言,使用netcat的用于查询ID时,仪器立即返回其内的ID ACK
。 但请求数据时,仪器需要更长的时间来获取它,并在仪器的网络适配器关闭连接,可以发送数据之前。
找到病根
注释建议使用这些工具,但它不是小事,所以我将深入研究的一般程序:
在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
在第一个终端窗口中,通过按压停止tcpdump的CTRL+C
重复此几种不同scenarious,节省每次输出到不同的使用.dump文件。
在具有GUI(Windows中,我的情况,而且也适用于Ubuntu的)任何一台PC上安装Wireshark的,并期待在使用.dump文件。
注意该系列的SYN
(“我想建立一个连接”), SYN+ACK
(“我理解你,也要让你的连接”), FIN+ACK
(我想停下来跟你说话)旗帜在捕获的数据包。 在比较这些标志出现在不同的场景顺序。 如果你不知道这是什么意思, 这是一个伟大的介绍 。 (如果你想进入粗糙的细节,也注重“序列”和“确认”的数字。)
一个解法
告诉netcat的关闭通过使用-q开关的连接之前要等待。
echo "TRAC? TRACE1" | netcat -q 1 192.168.0.10 5025
在上面的命令,等待时间为1秒。
我相信有更好的解决方案(等待一个包PSH
集而不是一个固定的时间可以是太短或太长),但这个作品不够好,我。