forked from kallydev/trojanx
/
udpConn.go
38 lines (33 loc) · 818 Bytes
/
udpConn.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
package tunnel
import (
"github.com/7ten7/trojanx/internal/common"
"net"
)
type UDPConn struct {
*net.UDPConn
}
func (c *UDPConn) WriteWithMetadata(p []byte, adder *common.Address) (int, error) {
return c.WriteTo(p, adder)
}
func (c *UDPConn) ReadWithMetadata(p []byte) (int, *common.Address, error) {
n, addr, err := c.ReadFrom(p)
if err != nil {
return 0, nil, err
}
address, err := common.NewAddressFromAddr("udp", addr.String())
return n, address, nil
}
func (c *UDPConn) WriteTo(p []byte, addr net.Addr) (int, error) {
if udpAddr, ok := addr.(*net.UDPAddr); ok {
return c.WriteToUDP(p, udpAddr)
}
ip, err := addr.(*common.Address).ResolveIP()
if err != nil {
return 0, err
}
udpAddr := &net.UDPAddr{
IP: ip,
Port: addr.(*common.Address).Port,
}
return c.WriteToUDP(p, udpAddr)
}