【发布时间】:2016-10-27 21:17:05
【问题描述】:
我需要从 nfcapd 二进制文件中获取有关源 IP 和目标 IP 的信息。问题在于文件的大小。我知道使用 io 或 os 包打开和读取非常大(超过 1 GB)的文件是不可取的。
这是我的黑客和草稿开始:
package main
import (
"fmt"
"time"
"os"
"github.com/tehmaze/netflow/netflow5"
"log"
"io"
"bytes"
)
type Message interface {}
func main() {
startTime := time.Now()
getFile := os.Args[1]
processFile(getFile)
endTime := time.Since(startTime)
log.Printf("Program executes in %s", endTime)
}
func processFile(fileName string) {
file, err := os.Open(fileName)
// Check if file is not empty. If it is, then exit from program
if err != nil {
fmt.Println(err)
os.Exit(1)
}
// Useful to close file after getting information about it
defer file.Close()
Read(file)
}
func Read(r io.Reader) (Message, error) {
data := [2]byte{}
if _, err := r.Read(data[:]); err != nil {
return nil, err
}
buffer := bytes.NewBuffer(data[:])
mr := io.MultiReader(buffer, r)
return netflow5.Read(mr)
}
我想将文件拆分为具有 24 个流的块,并在使用 netflow package 读取后并发处理它。但我无法想象如何在除法期间不丢失任何数据的情况下做到这一点。
如果我遗漏了代码或描述中的某些内容,请修复我。我花了很多时间在网上搜索我的解决方案并考虑其他可能的实现方式。
我们将不胜感激任何帮助和/或建议。
文件具有以下属性(终端中的命令file -I <file_name>):
file_name: application/octet-stream; charset=binary
命令nfdump -r <file_name>之后的文件输出结构如下:
Date first seen Duration Proto Src IP Addr:Port Dst IP Addr:Port Packets Bytes Flows
每个属性都在自己的列上。
更新 1: 不幸的是,由于二进制文件结构的差异,通过 nfcapd 将文件保存到磁盘后,使用 netflow 包解析文件是impossible。此答案由nfdump 贡献者中的one 给出。
现在唯一的方法是在 go 程序中从终端运行 nfdump,例如 pynfdump。
【问题讨论】:
-
这个 nfcapd 二进制文件的结构是什么?它实际上是一个结构合理的文本文件吗?您的问题是您不知道如何有效地读取文件,还是您还需要解析 IP 的帮助?
-
我在 GitHub Gist 中找到了一个示例输出文件:gist.githubusercontent.com/asachs/bfbfebdb39b33a5ded61/raw/… 我假设您正在处理的是一个非常大的版本。
-
@HenryTK 我添加了有关文件的更多信息。我现在不知道如何有效地读取文件和解析 IP。我是 Golang 的新手。
-
你为什么要创建一个 goroutine 来读取文件
go Read(file)??好吧,我警告你,你的程序肯定不会做任何事情,main() 函数将结束,就是这样。 -
@YandryPozo 哦,对不起。这是错字