Linux 和 Windows 之间的 PING 退出代码不同

问题描述 投票:0回答:1

我今天注意到这种行为,这对我来说是一个奇怪的惊喜。

Linux:

ping host_live : exit code 0
ping host_down : exit code 1
ping host_not_found : exit code 1

Windows 7 :

ping host_live : exit code 0
ping host_down : exit code 0
ping host_not_found : exit code 1

( host_not_found :我的意思是,主机名无法解析为 IP 地址)

=== Windows ===

考虑到 TcpIp 堆栈和实用程序是在 unix 下诞生并从其他供应商/操作系统复制的,这就是这种不同行为的基本原理?

在批处理脚本开始时,如何检测远程方是否已关闭?

我应该在 1200 个客户端上部署自定义 ping 实用程序吗?

linux windows network-programming tcp ping
1个回答
0
投票

在 Windows 中测试由

ERRORLEVEL
设置的
ping
(退出代码)是徒劳的,因为在某些情况下,即使没有从远程主机收到任何有效回复,它也会将
ERRORLEVEL
设置为 0(成功) !!!

但是,下面描述的方法是可靠的、可移植的并且适用于:

  1. 翻译成所有其他语言,例如:“ms”、“TTL”、“回复”、“丢失”、“无法到达”、“已收到”等...,包括俄语和中文。
  2. Ping IPv4 地址。
  3. Ping IPv6 地址。
  4. 发生错误“一般故障”的情况。
  5. Ping 一个地址,返回 “请求超时。”
  6. Ping 一个地址,返回 “目标主机无法访问。”
  7. Ping 可解析的字母数字主机。
  8. Ping 无法解析的字母数字主机,这会导致返回 “Ping 请求无法找到主机 UnresolvableHost...” 错误。
@echo off

for /F %%A in ('ping %1 -n 1 ^| findstr /C:^= ^| find /c /v ""') do (set "res=%%A")

if %res% GEQ 3 (
    echo SUCCESS.
) else (
    echo FAILURE.
)

如果将上面的代码保存到名为例如

pingtest.bat
,你可以这样使用它:

pingtest 192.168.1.1

此方法利用了字符串中存在的等号

bytes=
,这些等号不受翻译为其他语言的影响,并且不会出现在不成功的 ping/echo 结果中。

此外,将开关

-n 1
修改为例如
-n 6
允许您在变量
%res%
中获得反映连接质量的定性结果。

使用下面的代码,您可以标准化变量

%res%
中的结果,使其在失败时变为
0
...以及在成功时 - 成功 ping 的数量:

@echo off

for /F %%A in ('ping %1 -n 6 ^| findstr /C:^= ^| find /c /v ""') do (set "res=%%A")

if %res% GEQ 3 (
    set /A "res=%res%-2"
) else (
    set "res=0"
)

echo The number of successful pings is %res%

要暂停程序直到成功 ping 通主机,只需像这样循环调用它:

@echo off

:loop
for /F %%A in ('ping %1 -n 1 ^| findstr /C:^= ^| find /c /v ""') do (set "res=%%A")

if %res% LSS 3 goto :loop
最新问题
© www.soinside.com 2019 - 2025. All rights reserved.