gpt4 book ai didi

go - 从大型 nfcapd 二进制文件获取 IP 地址

转载 作者:数据小太阳 更新时间:2023-10-29 03:37:28 27 4
gpt4 key购买 nike

我需要从 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)
}

我想用netflow 将文件分成24 个流的 block 并在读取后并发处理它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:不幸的是,它是impossible由于二进制文件结构的差异,通过 nfcapd 将文件保存到磁盘后,使用 netflow 包解析文件。 one给出了这个答案的 nfdump贡献者。

现在唯一的方法是在 go 程序中从终端运行 nfdump,如 pynfdump .

另一个possible将来的解决方案是使用 gopacket .

最佳答案

IO 几乎总是解析文件时的限制因素,除非涉及大量计算,否则串行读取单个文件将是处理它的最快方式。

将文件包装在 bufio.Reader 中并将其交给 Read 函数:

file, err := os.Open(fileName)
if err != nil {
log.Fatal((err)
}
defer file.Close()

packet, err := netflow5.Read(bufio.NewReader(file))

解析后,如果需要单独处理数据 block ,则可以拆分记录。

关于go - 从大型 nfcapd 二进制文件获取 IP 地址,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40223913/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com