Network programming 用Tcl确定默认网关

Network programming 用Tcl确定默认网关,network-programming,tcl,tk,Network Programming,Tcl,Tk,我有一个Tcl/Tk脚本,我需要找到它运行的计算机的默认网关,以建立到路由器的连接。有没有办法(最好是跨平台)确定计算机的默认网关设置为什么 我设想对于Linux(Ubuntu,特别是我的目标平台),我可以调用“route”命令并解析它,但我不确定它是否能在Windows上工作,原则上,如果可能的话,我希望避免进行系统调用。获取网络路由信息的方法是询问操作系统。这也是一个不太跨平台的操作。在Windows上,最简单的方法是解析ipconfig/all的输出 set output [exec {*

我有一个Tcl/Tk脚本,我需要找到它运行的计算机的默认网关,以建立到路由器的连接。有没有办法(最好是跨平台)确定计算机的默认网关设置为什么


我设想对于Linux(Ubuntu,特别是我的目标平台),我可以调用“route”命令并解析它,但我不确定它是否能在Windows上工作,原则上,如果可能的话,我希望避免进行系统调用。

获取网络路由信息的方法是询问操作系统。这也是一个不太跨平台的操作。在Windows上,最简单的方法是解析
ipconfig/all
的输出

set output [exec {*}[auto_execok ipconfig] /all]
if {[regexp -line {Default Gateway[ .]*: (.+)} $output -> gw]} {
    puts "The default gateway is $gw"
} else {
    puts "No default gateway found"
}
在Linux上,您需要执行以下操作:

# Note, might not be on your PATH by default
set output [exec /sbin/route -n]
if {[regexp -line {^0\.0\.0\.0\s+([0-9.]+)} $output -> gw]} {
    puts "The default gateway is $gw"
} else {
    puts "No default gateway found"
}
在OSX(和其他BSD衍生产品)上,您需要不同的咒语:

set output [exec /sbin/route -n get 0.0.0.0]
if {[regexp -line {gateway: ([0-9.]+)} $output -> gw]} {
    puts "The default gateway is $gw"
} else {
    puts "No default gateway found"
}
正如你所看到的,这是令人沮丧的困难!让我们用一个过程来结束它,这个过程用来决定做什么

proc gateway {varName} {
    upvar 1 $varName gw
    global tcl_platform
    if {$tcl_platform(platform) eq "windows"} {
        set output [exec {*}[auto_execok ipconfig] /all]
        set RE {Default Gateway[ .]*: (.+)}
    } elseif {$tcl_platform(os) eq "Linux"} {
        set output [exec /sbin/route -n]
        set RE {^0\.0\.0\.0\s+([0-9.]+)}
    } else {
        # Assume we're OSX or BSD
        set output [exec /sbin/route -n get 0.0.0.0]
        set RE {gateway: ([0-9.]+)}
    }
    return [regexp -line $RE $output -> gw]
}
现在,您可以在所有平台上执行此操作:

if {[gateway gw]} {
    puts "The default gateway is $gw"
} else {
    puts "No default gateway found"
}

底层代码不可移植,但您的代码可以移植。轻松点

相当优雅的回答;我喜欢。目前,Upvoting将在我立即接受之前等待,看看是否有其他人带来了令人兴奋的东西(我的一个抱怨是它确实会打系统/执行呼叫,我不喜欢):)