optimize(sniffer): wait data for 300ms instead of 100ms

This commit is contained in:
mzz2017 2023-04-12 22:27:44 +08:00
parent 08f75bef44
commit e61ac598b5
3 changed files with 19 additions and 11 deletions

View File

@ -11,6 +11,10 @@ import (
"time"
)
const (
DataWaitingTimeout = 300 * time.Millisecond
)
type Sniffer struct {
// Stream
stream bool
@ -70,14 +74,14 @@ func (s *Sniffer) SniffTcp() (d string, err error) {
close(s.dataReady)
}()
// Waiting 100ms for data.
// Waiting 300ms for data.
select {
case <-time.After(100 * time.Millisecond):
return "", NotApplicableError
case <-s.dataReady:
if s.dataError != nil {
return "", s.dataError
}
case <-time.After(DataWaitingTimeout):
return "", NotApplicableError
}
} else {
close(s.dataReady)
@ -112,14 +116,19 @@ func (s *Sniffer) SniffUdp() (d string, err error) {
func (s *Sniffer) Read(p []byte) (n int, err error) {
<-s.dataReady
if s.dataError != nil {
return 0, s.dataError
}
s.readMu.Lock()
defer s.readMu.Unlock()
if s.buf != nil && s.bufAt < len(s.buf) {
if s.dataError != nil {
if s.bufAt < len(s.buf) {
n = copy(p, s.buf[s.bufAt:])
s.bufAt += n
}
return n, s.dataError
}
if s.bufAt < len(s.buf) {
// Read buf first.
n = copy(p, s.buf[s.bufAt:])
s.bufAt += n

View File

@ -30,12 +30,12 @@ func (c *ControlPlane) handleConn(lConn net.Conn) (err error) {
// Sniff target domain.
sniffer := sniffing.NewConnSniffer(lConn, TcpSniffBufSize)
// ConnSniffer should be used later, so we cannot close it now.
defer sniffer.Close()
domain, err := sniffer.SniffTcp()
if err != nil && !sniffing.IsSniffingError(err) {
return err
}
// ConnSniffer should be used later, so we cannot close it now.
defer sniffer.Close()
// Get tuples and outbound.
src := lConn.RemoteAddr().(*net.TCPAddr).AddrPort()

View File

@ -129,12 +129,11 @@ func (c *ControlPlane) handlePkt(lConn *net.UDPConn, data []byte, src, pktDst, r
if !isDns {
// Sniff Quic, ...
sniffer := sniffing.NewPacketSniffer(data)
defer sniffer.Close()
domain, err = sniffer.SniffUdp()
if err != nil && !sniffing.IsSniffingError(err) {
sniffer.Close()
return err
}
sniffer.Close()
}
// Get outbound.