Golang 基於libpcap/winpcap的底層網絡編程——gopacket安裝


Go簡介

Go是一種編譯型語言,它結合了解釋型語言的游刃有余,動態類型語言的開發效率,以及靜態類型的安全性。

語法類似C/C++,但是又帶有一點python的味道

其中個人認為最出色的特點就是他的包管理,你可以在GoDocGo Search上找到非常多有用的包以及文檔

同時只需執行 go get path ( e.g. go get https://godoc.org/github.com/google/gopacket)就可以將包下載到本地

gopacket簡介

gopacketgoogle實現的一個基於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行的三個路徑改為對應的安裝路徑即可

轉載請注明出處:http://www.cnblogs.com/tr3e/p/7137089.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM