add dialer conn in stats

This commit is contained in:
Jason
2019-08-07 17:30:02 +08:00
parent 2bf585afed
commit 5ef6008b3c
4 changed files with 29 additions and 25 deletions

View File

@@ -56,17 +56,18 @@ func (s *simpleSessionStater) Start() error {
}) })
_, _ = fmt.Fprintf(w, "<table style=\"border=4px solid\">") _, _ = fmt.Fprintf(w, "<table style=\"border=4px solid\">")
_, _ = fmt.Fprintf(w, "<tr><td>Process Name</td><td>Network</td><td>Duration</td><td>Local Addr</td><td>Remote Addr</td><td>Upload Bytes</td><td>Download Bytes</td></tr>") _, _ = fmt.Fprintf(w, "<tr><td>Process Name</td><td>Network</td><td>Duration</td><td>Dialer Addr</td><td>Client Addr</td><td>Target Addr</td><td>Upload Bytes</td><td>Download Bytes</td></tr>")
sort.Slice(sessions, func(i, j int) bool { sort.Slice(sessions, func(i, j int) bool {
return sessions[i].SessionStart.After(sessions[j].SessionStart) return sessions[i].SessionStart.After(sessions[j].SessionStart)
}) })
for _, sess := range sessions { for _, sess := range sessions {
_, _ = fmt.Fprintf(w, "<tr><td>%v</td><td>%v</td><td>%v</td><td>%v</td><td>%v</td><td>%v</td><td>%v</td></tr>", _, _ = fmt.Fprintf(w, "<tr><td>%v</td><td>%v</td><td>%v</td><td>%v</td><td>%v</td><td>%v</td><td>%v</td><td>%v</td></tr>",
sess.ProcessName, sess.ProcessName,
sess.Network, sess.Network,
time.Now().Sub(sess.SessionStart).Round(time.Second), time.Now().Sub(sess.SessionStart).Round(time.Second),
sess.LocalAddr, sess.DialerAddr,
sess.RemoteAddr, sess.ClientAddr,
sess.TargetAddr,
p.Sprintf("%d", atomic.LoadInt64(&sess.UploadBytes)), p.Sprintf("%d", atomic.LoadInt64(&sess.UploadBytes)),
p.Sprintf("%d", atomic.LoadInt64(&sess.DownloadBytes)), p.Sprintf("%d", atomic.LoadInt64(&sess.DownloadBytes)),
) )

View File

@@ -16,8 +16,9 @@ type SessionStater interface {
type Session struct { type Session struct {
ProcessName string ProcessName string
Network string Network string
LocalAddr string DialerAddr string
RemoteAddr string ClientAddr string
TargetAddr string
UploadBytes int64 UploadBytes int64
DownloadBytes int64 DownloadBytes int64
SessionStart time.Time SessionStart time.Time

View File

@@ -86,7 +86,7 @@ func (h *tcpHandler) relay(localConn, remoteConn net.Conn, sess *stats.Session)
remoteConn.Close() remoteConn.Close()
}() }()
// Uplink // UpLink
go func() { go func() {
var err error var err error
if h.sessionStater != nil && sess != nil { if h.sessionStater != nil && sess != nil {
@@ -98,7 +98,7 @@ func (h *tcpHandler) relay(localConn, remoteConn net.Conn, sess *stats.Session)
upCh <- err upCh <- err
}() }()
// Downlink // DownLink
if h.sessionStater != nil && sess != nil { if h.sessionStater != nil && sess != nil {
statsCopy(localConn, remoteConn, sess, dirDownlink) statsCopy(localConn, remoteConn, sess, dirDownlink)
} else { } else {
@@ -147,8 +147,9 @@ func (h *tcpHandler) Handle(localConn net.Conn, target *net.TCPAddr) error {
sess = &stats.Session{ sess = &stats.Session{
ProcessName: process, ProcessName: process,
Network: target.Network(), Network: target.Network(),
LocalAddr: localConn.LocalAddr().String(), DialerAddr: remoteConn.LocalAddr().String(),
RemoteAddr: targetAddr, ClientAddr: localConn.LocalAddr().String(),
TargetAddr: targetAddr,
UploadBytes: 0, UploadBytes: 0,
DownloadBytes: 0, DownloadBytes: 0,
SessionStart: time.Now(), SessionStart: time.Now(),

View File

@@ -118,31 +118,31 @@ func (h *udpHandler) Connect(conn core.UDPConn, target *net.UDPAddr) error {
} }
func (h *udpHandler) connectInternal(conn core.UDPConn, targetAddr string) error { func (h *udpHandler) connectInternal(conn core.UDPConn, targetAddr string) error {
c, err := net.DialTimeout("tcp", core.ParseTCPAddr(h.proxyHost, h.proxyPort).String(), 4*time.Second) remoteConn, err := net.DialTimeout("tcp", core.ParseTCPAddr(h.proxyHost, h.proxyPort).String(), 4*time.Second)
if err != nil { if err != nil {
return err return err
} }
_ = c.SetDeadline(time.Now().Add(4 * time.Second)) _ = remoteConn.SetDeadline(time.Now().Add(4 * time.Second))
// send VER, NMETHODS, METHODS // send VER, NMETHODS, METHODS
_, _ = c.Write([]byte{5, 1, 0}) _, _ = remoteConn.Write([]byte{5, 1, 0})
buf := make([]byte, MaxAddrLen) buf := make([]byte, MaxAddrLen)
// read VER METHOD // read VER METHOD
if _, err := io.ReadFull(c, buf[:2]); err != nil { if _, err := io.ReadFull(remoteConn, buf[:2]); err != nil {
return err return err
} }
if len(targetAddr) != 0 { if len(targetAddr) != 0 {
targetAddr := ParseAddr(targetAddr) targetAddr := ParseAddr(targetAddr)
// write VER CMD RSV ATYP DST.ADDR DST.PORT // write VER CMD RSV ATYP DST.ADDR DST.PORT
_, _ = c.Write(append([]byte{5, socks5UDPAssociate, 0}, targetAddr...)) _, _ = remoteConn.Write(append([]byte{5, socks5UDPAssociate, 0}, targetAddr...))
} else { } else {
_, _ = c.Write(append([]byte{5, socks5UDPAssociate, 0}, []byte{1, 0, 0, 0, 0, 0, 0}...)) _, _ = remoteConn.Write(append([]byte{5, socks5UDPAssociate, 0}, []byte{1, 0, 0, 0, 0, 0, 0}...))
} }
// read VER REP RSV ATYP BND.ADDR BND.PORT // read VER REP RSV ATYP BND.ADDR BND.PORT
if _, err := io.ReadFull(c, buf[:3]); err != nil { if _, err := io.ReadFull(remoteConn, buf[:3]); err != nil {
return err return err
} }
@@ -151,7 +151,7 @@ func (h *udpHandler) connectInternal(conn core.UDPConn, targetAddr string) error
return errors.New("SOCKS handshake failed") return errors.New("SOCKS handshake failed")
} }
remoteAddr, err := readAddr(c, buf) remoteAddr, err := readAddr(remoteConn, buf)
if err != nil { if err != nil {
return err return err
} }
@@ -161,20 +161,20 @@ func (h *udpHandler) connectInternal(conn core.UDPConn, targetAddr string) error
return errors.New("failed to resolve remote address") return errors.New("failed to resolve remote address")
} }
go h.handleTCP(conn, c) go h.handleTCP(conn, remoteConn)
pc, err := net.ListenPacket("udp", "") remoteUDPConn, err := net.ListenPacket("udp", "")
if err != nil { if err != nil {
return err return err
} }
h.Lock() h.Lock()
h.tcpConns[conn] = c h.tcpConns[conn] = remoteConn
h.udpConns[conn] = pc h.udpConns[conn] = remoteUDPConn
h.remoteAddrs[conn] = resolvedRemoteAddr h.remoteAddrs[conn] = resolvedRemoteAddr
h.Unlock() h.Unlock()
go h.fetchUDPInput(conn, pc) go h.fetchUDPInput(conn, remoteUDPConn)
if len(targetAddr) != 0 { if len(targetAddr) != 0 {
var process string var process string
@@ -190,8 +190,9 @@ func (h *udpHandler) connectInternal(conn core.UDPConn, targetAddr string) error
sess := &stats.Session{ sess := &stats.Session{
ProcessName: process, ProcessName: process,
Network: conn.LocalAddr().Network(), Network: conn.LocalAddr().Network(),
LocalAddr: conn.LocalAddr().String(), DialerAddr: remoteConn.LocalAddr().String(),
RemoteAddr: targetAddr, ClientAddr: conn.LocalAddr().String(),
TargetAddr: targetAddr,
UploadBytes: 0, UploadBytes: 0,
DownloadBytes: 0, DownloadBytes: 0,
SessionStart: time.Now(), SessionStart: time.Now(),