Go簡介
Go是一種編譯型語言,它結合了解釋型語言的游刃有余,動態類型語言的開發效率,以及靜態類型的安全性。
語法類似C/C++,但是又帶有一點python的味道
其中個人認為最出色的特點就是他的包管理,你可以在GoDoc、Go Search上找到非常多有用的包以及文檔
同時只需執行 go get path ( e.g. go get https://godoc.org/github.com/google/gopacket)就可以將包下載到本地
gopacket簡介
gopacket是google實現的一個基於libpcap的包,可以在GoDoc上找到該包的相關文檔
它包含許多子包,提供了豐富的函數庫,通過導入gopacket就可以使用libpcap提供的大多數API
gopacket安裝
雖然gopacket是基於libpcap實現的,但是安裝winpcap同樣適用
不過不管選擇libpcap還是winpcap,在使用都需要先進行相應的安裝到本地(筆者安裝的是winpcap)
首先,通過go get https://godoc.org/github.com/google/gopacket,該命令會將其下載到GOPATH (e.g. E:/GoWorkspace)
但在正式使用它進行開發之前還有幾個注意事項:
編寫代碼test.go
//測試gopacket是否能夠正常使用
package main
import (
"fmt"
_ "github.com/google/gopacket"
_ "github.com/google/gopacket/pcap"
)
func main() {
fmt.Println("It works!")
}
運行go run test.go,若成功輸出,那么請跳過后文,開始你的gopacket之旅吧!
但可能會出現如下錯誤
# github.com/google/gopacket/pcap
E:\GoWorkspace\src\github.com\google\gopacket\pcap\pcap.go:21:10: fatal error: pcap.h: No such file or directory
#include <pcap.h>
^~~~~~~~
compilation terminated.
筆者也遇到了這個錯誤,google了很久並沒有找到任何有用的解決方案,之后看了gopacket源碼才解決
究其原因就是在於github.com/google/gopacket/pcap/pcap.go這個文件
//截取pcap.go的11-21行如下
#cgo solaris LDFLAGS: -L /opt/local/lib -lpcap
#cgo linux LDFLAGS: -lpcap
#cgo dragonfly LDFLAGS: -lpcap
#cgo freebsd LDFLAGS: -lpcap
#cgo openbsd LDFLAGS: -lpcap
#cgo darwin LDFLAGS: -lpcap
#cgo windows CFLAGS: -I C:/WpdPack/Include //問題出在 17-19行
#cgo windows,386 LDFLAGS: -L C:/WpdPack/Lib -lwpcap
#cgo windows,amd64 LDFLAGS: -L C:/WpdPack/Lib/x64 -lwpcap
#include <stdlib.h>
#include <pcap.h>
由於pcap.go中寫了一個C的wrapper,但是寫死了libpcap/winpcap的安裝路徑 pcap.go:L17-19 ,所以如果安裝位置並非默認則會報上述錯誤
解決方案:
- 卸載並重新安裝libpcap/winpcap到默認位置
- 修改github.com/google/gopacket/pcap/pcap.go文件
前者太過繁瑣,筆者選擇后者,將pcap.go 17-19行的三個路徑改為對應的安裝路徑即可
