bug fix:并发读写map问题;add:新增Stop()函数
This commit is contained in:
		
							parent
							
								
									5cb3c6d651
								
							
						
					
					
						commit
						d58df54cd6
					
				
							
								
								
									
										6
									
								
								bcap.go
									
									
									
									
									
								
							
							
						
						
									
										6
									
								
								bcap.go
									
									
									
									
									
								
							| @ -40,6 +40,8 @@ type PacketInfo struct { | |||||||
| } | } | ||||||
| 
 | 
 | ||||||
| func (p *Packets) Key(key string) PacketInfo { | func (p *Packets) Key(key string) PacketInfo { | ||||||
|  | 	p.RLock() | ||||||
|  | 	defer p.RUnlock() | ||||||
| 	return p.cu[key] | 	return p.cu[key] | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| @ -155,7 +157,9 @@ func (p *Packets) parseTcp(info PacketInfo, packet gopacket.Packet, layer gopack | |||||||
| 	info.finState = tcp.FIN | 	info.finState = tcp.FIN | ||||||
| 	info.synState = tcp.SYN | 	info.synState = tcp.SYN | ||||||
| 	info.tcpWindow = tcp.Window | 	info.tcpWindow = tcp.Window | ||||||
|  | 	p.RLock() | ||||||
| 	lastPacket := p.cu[info.Key] | 	lastPacket := p.cu[info.Key] | ||||||
|  | 	p.RUnlock() | ||||||
| 	if lastPacket.Key != info.Key { | 	if lastPacket.Key != info.Key { | ||||||
| 		lastPacket = PacketInfo{ | 		lastPacket = PacketInfo{ | ||||||
| 			Key:           info.Key, | 			Key:           info.Key, | ||||||
| @ -180,7 +184,9 @@ func (p *Packets) parseTcp(info PacketInfo, packet gopacket.Packet, layer gopack | |||||||
| 		p.cu[info.Key] = lastPacket | 		p.cu[info.Key] = lastPacket | ||||||
| 		p.Unlock() | 		p.Unlock() | ||||||
| 	} | 	} | ||||||
|  | 	p.RLock() | ||||||
| 	lastReverse := p.cu[info.ReverseKey] | 	lastReverse := p.cu[info.ReverseKey] | ||||||
|  | 	p.RUnlock() | ||||||
| 	if !lastPacket.isFirst { | 	if !lastPacket.isFirst { | ||||||
| 		info.comment = lastPacket.comment | 		info.comment = lastPacket.comment | ||||||
| 		if lastPacket.SrcMac != nil && len(info.SrcMac) == 0 { | 		if lastPacket.SrcMac != nil && len(info.SrcMac) == 0 { | ||||||
|  | |||||||
| @ -1,6 +1,7 @@ | |||||||
| package libpcap | package libpcap | ||||||
| 
 | 
 | ||||||
| import ( | import ( | ||||||
|  | 	"context" | ||||||
| 	"fmt" | 	"fmt" | ||||||
| 	"github.com/google/gopacket" | 	"github.com/google/gopacket" | ||||||
| 	"github.com/google/gopacket/pcap" | 	"github.com/google/gopacket/pcap" | ||||||
| @ -12,12 +13,18 @@ type NetCatch struct { | |||||||
| 	sentence string | 	sentence string | ||||||
| 	fn       func(gopacket.Packet) | 	fn       func(gopacket.Packet) | ||||||
| 	*pcap.Handle | 	*pcap.Handle | ||||||
|  | 	ctx    context.Context | ||||||
|  | 	stopFn context.CancelFunc | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| func (n *NetCatch) SetRecall(fn func(p gopacket.Packet)) { | func (n *NetCatch) SetRecall(fn func(p gopacket.Packet)) { | ||||||
| 	n.fn = fn | 	n.fn = fn | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | func (n *NetCatch) Stop() { | ||||||
|  | 	n.stopFn() | ||||||
|  | } | ||||||
|  | 
 | ||||||
| func FindAllDevs() ([]pcap.Interface, error) { | func FindAllDevs() ([]pcap.Interface, error) { | ||||||
| 	return pcap.FindAllDevs() | 	return pcap.FindAllDevs() | ||||||
| } | } | ||||||
| @ -45,6 +52,7 @@ func NewCatch(host string, sentence string) (*NetCatch, error) { | |||||||
| 	nc.host = host | 	nc.host = host | ||||||
| 	nc.eth = eth | 	nc.eth = eth | ||||||
| 	nc.sentence = sentence | 	nc.sentence = sentence | ||||||
|  | 	nc.ctx, nc.stopFn = context.WithCancel(context.Background()) | ||||||
| 	return nc, nil | 	return nc, nil | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| @ -68,10 +76,14 @@ func (n *NetCatch) Run() error { | |||||||
| 		return err | 		return err | ||||||
| 	} | 	} | ||||||
| 	pks := gopacket.NewPacketSource(handle, handle.LinkType()) | 	pks := gopacket.NewPacketSource(handle, handle.LinkType()) | ||||||
| 	for packet := range pks.Packets() { | 	for { | ||||||
|  | 		select { | ||||||
|  | 		case packet := <-pks.Packets(): | ||||||
| 			if n.fn != nil { | 			if n.fn != nil { | ||||||
| 				n.fn(packet) | 				n.fn(packet) | ||||||
| 			} | 			} | ||||||
| 	} | 		case <-n.ctx.Done(): | ||||||
| 			return nil | 			return nil | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
| } | } | ||||||
|  | |||||||
| @ -38,6 +38,12 @@ func (n *NfQueue) SetRecall(fn func(id uint32, q *nfqueue.Nfqueue, p Packet)) { | |||||||
| 	n.recallFn = fn | 	n.recallFn = fn | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | func (n *NfQueue) Stop() { | ||||||
|  | 	if n.stopFn != nil { | ||||||
|  | 		n.stopFn() | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  | 
 | ||||||
| func (n *NfQueue) Run() error { | func (n *NfQueue) Run() error { | ||||||
| 	cfg := nfqueue.Config{ | 	cfg := nfqueue.Config{ | ||||||
| 		NfQueue:      n.queid, | 		NfQueue:      n.queid, | ||||||
|  | |||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user