-
Notifications
You must be signed in to change notification settings - Fork 51
/
socket.go
39 lines (34 loc) · 1.11 KB
/
socket.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
package inbound
import (
"net"
"net/netip"
C "github.com/yaling888/clash/constant"
"github.com/yaling888/clash/context"
"github.com/yaling888/clash/transport/socks5"
)
// NewSocket receive TCP inbound and return ConnContext
func NewSocket(target socks5.Addr, conn net.Conn, source C.Type) *context.ConnContext {
metadata := parseSocksAddr(target)
metadata.NetWork = C.TCP
metadata.Type = source
if ip, port, err := parseAddr(conn.RemoteAddr()); err == nil {
metadata.SrcIP = ip
metadata.SrcPort = C.Port(port)
}
if ip, port, err := parseAddr(conn.LocalAddr()); err == nil {
metadata.OriginDst = netip.AddrPortFrom(ip, uint16(port))
}
return context.NewConnContext(conn, metadata)
}
// NewSocketBy receive TCP inbound and return ConnContext
func NewSocketBy(conn net.Conn, src, dst netip.AddrPort, tp C.Type) *context.ConnContext {
metadata := &C.Metadata{}
metadata.NetWork = C.TCP
metadata.Type = tp
metadata.SrcIP = src.Addr()
metadata.SrcPort = C.Port(src.Port())
metadata.DstIP = dst.Addr()
metadata.DstPort = C.Port(dst.Port())
metadata.OriginDst = dst
return context.NewConnContext(conn, metadata)
}