使用 s3 檔案建立 gopacket 的 packetSource
當我從s3客戶端取得pcap檔案時,我需要產生gopacket的packetsource來讀取其中的封包。但是我只在gopacket文件中找到了openofflinefile函數,我該如何用[]byte(從s3檔讀取)產生packetsource。
我已經閱讀了gopacket中openofflinefile函數的源代碼,但我仍然很困惑,因為我不熟悉uintptr,我可以直接用[]byte生成一個unitptr,然後用它來生成packetsource嗎?
func openOffline(file string) (handle *Handle, err error) { err = LoadWinPCAP() if err != nil { return nil, err } buf := make([]byte, errorBufferSize) f, err := syscall.BytePtrFromString(file) if err != nil { return nil, err } var cptr uintptr if pcapOpenOfflineWithTstampPrecisionPtr == 0 { cptr, _, _ = syscall.Syscall(pcapOpenOfflinePtr, 2, uintptr(unsafe.Pointer(f)), uintptr(unsafe.Pointer(&buf[0])), 0) } else { cptr, _, _ = syscall.Syscall(pcapOpenOfflineWithTstampPrecisionPtr, 3, uintptr(unsafe.Pointer(f)), uintptr(pcapTstampPrecisionNano), uintptr(unsafe.Pointer(&buf[0]))) } if cptr == 0 { return nil, errors.New(byteSliceToString(buf)) } h := &Handle{cptr: pcapTPtr(cptr)} return h, nil }
正確答案
#嘗試 github.com/google/gopacket/pcapgo
#如果 github.com/google/gopacket/pcapgo
套件支援該檔案格式,請考慮使用它,因為它很容易:
package main import ( "bytes" "io" "log" "os" "github.com/google/gopacket" "github.com/google/gopacket/layers" "github.com/google/gopacket/pcapgo" ) func main() { f, err := os.open("test.pcap") if err != nil { panic(err) } // as described in the question, buf is read from s3 file. in order to // make this demo simple and executable, we read it from a local file. buf, err := io.readall(f) if err != nil { panic(err) } // convert []byte into a reader. the s3 client should give us a reader // that we can use directly in the place of the filereader. try the best // to avoid reading the response as []byte and then convert it into a reader. filereader := bytes.newreader(buf) r, err := pcapgo.newreader(filereader) if err != nil { panic(err) } source := gopacket.newpacketsource(r, layers.layertypeethernet) for packet := range source.packets() { log.printf("%v", packet) } }
將 os.pipe
與 github.com/google/gopacket/pcap
結合使用
如果github.com/google/gopacket/pcapgo
不支援該檔案格式,而我們必須使用github.com/google/gopacket/pcap
,解決方法是建立一個管道,並將r
檔案傳遞給pcap.openofflinefile
:
package main import ( "bytes" "io" "log" "os" "github.com/google/gopacket" "github.com/google/gopacket/layers" "github.com/google/gopacket/pcap" ) func main() { f, err := os.Open("test.pcap") if err != nil { panic(err) } // As described in the question, buf is read from S3 file. In order to // make this demo simple and executable, we read it from a local file. buf, err := io.ReadAll(f) if err != nil { panic(err) } r, w, err := os.Pipe() if err != nil { panic(err) } go func() { // Convert []byte into a reader. The S3 client should give us a reader // that we can use directly in the place of the fileReader. Try the best // to avoid reading the response as []byte and then convert it into a reader. fileReader := bytes.NewReader(buf) _, err := io.Copy(w, fileReader) defer w.Close() if err != nil { panic(err) } }() handle, err := pcap.OpenOfflineFile(r) if err != nil { panic(err) } source := gopacket.NewPacketSource(handle, layers.LayerTypeEthernet) for packet := range source.Packets() { log.Printf("%v", packet) } }
註解:
- 這僅在 linux 上進行了測試。但它應該可以在 windows 上運行。
-
github.com/google/gopacket/pcap
是libpcap
(或windows 上的winpcap
或npcap
)的包裝器。這就是為什麼使用[]byte
或io.reader
有點複雜。 - 當您從 s3 下載檔案時,客戶端應該為您提供一個閱讀器。您可以直接使用閱讀器(請參閱我的演示中的評論)。避免自己閱讀讀者的內容。
以上是使用 s3 檔案建立 gopacket 的 packetSource的詳細內容。更多資訊請關注PHP中文網其他相關文章!

熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

OpenSSL,作為廣泛應用於安全通信的開源庫,提供了加密算法、密鑰和證書管理等功能。然而,其歷史版本中存在一些已知安全漏洞,其中一些危害極大。本文將重點介紹Debian系統中OpenSSL的常見漏洞及應對措施。 DebianOpenSSL已知漏洞:OpenSSL曾出現過多個嚴重漏洞,例如:心臟出血漏洞(CVE-2014-0160):該漏洞影響OpenSSL1.0.1至1.0.1f以及1.0.2至1.0.2beta版本。攻擊者可利用此漏洞未經授權讀取服務器上的敏感信息,包括加密密鑰等。

後端學習路徑:從前端轉型到後端的探索之旅作為一名從前端開發轉型的後端初學者,你已經有了nodejs的基礎,...

在BeegoORM框架下,如何指定模型關聯的數據庫?許多Beego項目需要同時操作多個數據庫。當使用Beego...

Go語言中用於浮點數運算的庫介紹在Go語言(也稱為Golang)中,進行浮點數的加減乘除運算時,如何確保精度是�...

Go爬蟲Colly中的Queue線程問題探討在使用Go語言的Colly爬蟲庫時,開發者常常會遇到關於線程和請求隊列的問題。 �...

GoLand中自定義結構體標籤不顯示怎麼辦?在使用GoLand進行Go語言開發時,很多開發者會遇到自定義結構體標籤在�...

Go語言中使用RedisStream實現消息隊列時類型轉換問題在使用Go語言與Redis...

本文介紹如何在Debian系統上配置MongoDB實現自動擴容,主要步驟包括MongoDB副本集的設置和磁盤空間監控。一、MongoDB安裝首先,確保已在Debian系統上安裝MongoDB。使用以下命令安裝:sudoaptupdatesudoaptinstall-ymongodb-org二、配置MongoDB副本集MongoDB副本集確保高可用性和數據冗餘,是實現自動擴容的基礎。啟動MongoDB服務:sudosystemctlstartmongodsudosys
