golang pcap on Windows


環境構築が問題になりやすそうなので、ここに書いておく。

golang は Path から gcc を検索する。Windows 版 は MinGW gcc を使うようになっている。私の環境は Windows 8.1 64 bit なので、ダウンロードサイト から go1.2.2.windows-amd64.msi を選んだ。この時点で MinGW も 64 bit 版が必要になる。

普段から cygwin を使っているので、mingw は cygwin パッケージ化されたものを使うことにした。cygwin パッケージで mingw64-x86_64-gcc-core, mingw64-x86_64-binutils, mingw64-x86_64-headers, mingw64-x86_64-runtime を選択してインストールする。あるいはもちろん cygwin を使わずに MinGW を単体を直接入れても良い。ただし MinGW とは独立した Mingw-w64 というプロジェクトがあり、64 bit 版はそちらからインストールすること。

golang のライブラリは、GOPATH を使ってツリー管理する。ここでは testproj 以下に作ることにする。

mkdir testproj
export GOPATH=$(cygpath -d `pwd`/testproj)

gopacket を取得する。次のコマンドを実行すると testproj 以下にソースが取得される。

go get code.google.com/p/gopacket

code.google.com/p/gopacket/pcap のために WinPcap developer pack が必要。WpdPack というディレクトリが C:\WpdPack になるように展開して配置する。こうする理由は、gopacket/pcap/pcap.go#cgo windows CFLAGS: -I C:/WpdPack/Include などと書いてある内容と合致させるため。

ここまでセットアップできたら gopacket を使ったプログラムを書いてみる。

package main

import (
        "code.google.com/p/gopacket/pcap"
        "fmt"
)

func main() {
        ifs, err := pcap.FindAllDevs()
        if err == nil {
                for _, ife := range ifs {
                        fmt.Println(ife.Name, ife.Description)
                }
        }
}

実は現時点では gopacket を少し手直ししないといけない。パッチ送ったら、すぐに修正取り込んでくれた#13, #14ので、今は手直し不要。

cygwin mingw でうまく使うにはコツがある。残念なことに cygwin の mingw gcc は cygwin gcc から呼び出しできない(未対応)。gcc のフラグで切り替えられたらいいのだけれど、まだそこまで出来ていない。alternative のような仕組みもない。/usr/bin/gccx86_64-pc-cygwin-gcc と同一で、cygwin の mingw gcc は x86_64-w64-mingw32-gcc で呼び出さないといけない。ということで、次のようにする。

CC=x86_64-w64-mingw32-gcc LD=x86_64-w64-mingw32-ld go run test_program.go

mingw-w64 をインストールした場合は、PATH を通して、最初に見つかる gcc がそれになるように調整すればOK。