2017-11-17 4 views
1

任意のコンピュータ(OSX、WIn、Linなど)には、Wi-Fi、BlueTooth、Ethernetなど、接続されたネットワークアダプタがいくつでもあります。ルーティングによっては、複数のアクティブなデバイス。どのようにネットワークデバイスタイプを検出できますか?

私のNARROWの使用例では、現時点でCONNECTEDのデフォルトのアダプタタイプ(Wi-Fiなど)を知りたいと思っています。

Hereは、ほとんどの場合動作し、それをGoに変換するサンプルスクリプトですが、それは十分簡単です...私にはネイティブのGO方法が必要です。あなたはInterfaces()netからパッケージ

サンプル使用することができます

答えて

0

:Linuxの

package main 

import (
    "fmt" 
    "net" 
) 

func main() { 
    l, err := net.Interfaces() 
    if err != nil { 
     panic(err) 

    } 
    for _, f := range l { 
     if f.Flags&net.FlagUp > 0 { 
      fmt.Printf("%s is up\n", f.Name) 
     } 
    } 
} 
+0

これは良いアイデアでした...結果はLinux、OSX、Windowsで異なります。 Windowsでは、私は気温がWIFI、ETHERNET、CELLULARのいずれかであることを知ります... Linuxでは、lo、eth0を取得します。私はどのようなデバイスの種類を知っているので、Windowsの返信を探しています。 – Richard

+0

@リチャードはLinuxの仕様に関する回答を掲載しました。コメントは多すぎました。 – kostix

1

を、あなたはthe RTNETLINK interfaceを使用する必要があり、この層のラッパーを実装 a number of packages があるように見えると思います。

基本的には、RTM_GETLINKリクエストを発行してから、各インターフェイスのタイプ(そのマニュアルのifi_typeフィールド)を確認します。 利用可能なタイプはhereです - 802.2(イーサネット)と802.11(Wi-Fi)のものが必要です。


また、最初 net.Interfaces()を使用して、 に「/ SYS /クラス/ネット/ {iface_name} /という名前のファイルを読み取ろうとすることで自分のクラスを照会することによって、「ローテク」なアプローチを実装しようとすることができタイプ "(説明されているようにhere)。そのタイプは、上記のifi_typeフィールドに含まれています。このアプローチはいくつかの欠点を持っていることを

注:

  • インタフェースが来て、いつでも行くので、net.Interfaces()経由で自分のリストを取得し、その/sys仮想ファイルシステムを経由して各インターフェイス を照会 間に固有のレースがあります可能性があります。

  • その/sysファイルシステムが特定のシステムにマウントされていない可能性があります。 これは、典型的なデスクトップやサーバーシステムではまったく珍しいことですが、埋め込みなどの「奇妙な」インストールではそれほど多くはありません。

関連する問題