97 lines
2.1 KiB
Go
97 lines
2.1 KiB
Go
package capture
|
|
|
|
import (
|
|
"bytes"
|
|
"crypto/md5"
|
|
"encoding/hex"
|
|
"equipment-analyzer/internal/model"
|
|
"sort"
|
|
"sync"
|
|
)
|
|
|
|
type TCPProcessor struct {
|
|
mutex sync.RWMutex
|
|
ackData map[uint32][]*model.TCPData
|
|
finalBuffer []string
|
|
loads map[string]bool // 去重用
|
|
}
|
|
|
|
func NewTCPProcessor() *TCPProcessor {
|
|
return &TCPProcessor{
|
|
ackData: make(map[uint32][]*model.TCPData),
|
|
loads: make(map[string]bool),
|
|
}
|
|
}
|
|
|
|
func (tp *TCPProcessor) ProcessPacket(tcpData *model.TCPData) {
|
|
tp.mutex.Lock()
|
|
defer tp.mutex.Unlock()
|
|
|
|
// 生成数据哈希用于去重
|
|
hash := tp.generateHash(tcpData.Payload)
|
|
if tp.loads[hash] {
|
|
return // 跳过重复数据
|
|
}
|
|
tp.loads[hash] = true
|
|
|
|
// 按ACK号分组存储
|
|
ack := uint32(tcpData.Ack)
|
|
if tp.ackData[ack] == nil {
|
|
tp.ackData[ack] = make([]*model.TCPData, 0)
|
|
}
|
|
tp.ackData[ack] = append(tp.ackData[ack], tcpData)
|
|
}
|
|
|
|
func (tp *TCPProcessor) generateHash(data []byte) string {
|
|
hash := md5.Sum(data)
|
|
return hex.EncodeToString(hash[:])
|
|
}
|
|
|
|
func (tp *TCPProcessor) ProcessAllData() {
|
|
tp.mutex.Lock()
|
|
defer tp.mutex.Unlock()
|
|
|
|
tp.finalBuffer = make([]string, 0)
|
|
|
|
for ack, dataList := range tp.ackData {
|
|
tp.tryBuffer(ack, dataList)
|
|
}
|
|
}
|
|
|
|
func (tp *TCPProcessor) tryBuffer(ack uint32, dataList []*model.TCPData) {
|
|
// 按序列号排序
|
|
sort.Slice(dataList, func(i, j int) bool {
|
|
return dataList[i].Seq < dataList[j].Seq
|
|
})
|
|
|
|
// 合并所有分片数据
|
|
var buffer bytes.Buffer
|
|
for _, data := range dataList {
|
|
buffer.Write(data.Payload)
|
|
}
|
|
|
|
// 转换为十六进制字符串
|
|
hexStr := hex.EncodeToString(buffer.Bytes())
|
|
tp.finalBuffer = append(tp.finalBuffer, hexStr)
|
|
}
|
|
|
|
func (tp *TCPProcessor) GetFinalBuffer() []string {
|
|
tp.mutex.RLock()
|
|
defer tp.mutex.RUnlock()
|
|
|
|
result := make([]string, len(tp.finalBuffer))
|
|
copy(result, tp.finalBuffer)
|
|
//// 输出每条finalBuffer的16进制字符串到控制台
|
|
//fmt.Println("抓取16进制字符串")
|
|
//fmt.Println(result)
|
|
return result
|
|
}
|
|
func (tp *TCPProcessor) Clear() {
|
|
tp.mutex.Lock()
|
|
defer tp.mutex.Unlock()
|
|
|
|
tp.ackData = make(map[uint32][]*model.TCPData)
|
|
tp.finalBuffer = make([]string, 0)
|
|
tp.loads = make(map[string]bool)
|
|
}
|