@@ -18,10 +18,25 @@ type bindPacketConn struct {
1818 addr net.Addr
1919}
2020
21+ type bindUDPConn struct {
22+ bindPacketConn
23+ N.EXP_UDPConn
24+ }
25+
2126func NewBindPacketConn (conn net.PacketConn , addr net.Addr ) BindPacketConn {
22- return & bindPacketConn {
23- NewPacketConn (conn ),
24- addr ,
27+ if udpConn , isUDPConn := conn .(N.EXP_UDPConn ); isUDPConn {
28+ return & bindUDPConn {
29+ bindPacketConn {
30+ NewPacketConn (conn ),
31+ addr ,
32+ },
33+ udpConn ,
34+ }
35+ } else {
36+ return & bindPacketConn {
37+ NewPacketConn (conn ),
38+ addr ,
39+ }
2540 }
2641}
2742
@@ -61,16 +76,36 @@ type UnbindPacketConn struct {
6176}
6277
6378func NewUnbindPacketConn (conn net.Conn ) N.NetPacketConn {
64- return & UnbindPacketConn {
65- NewExtendedConn (conn ),
66- M .SocksaddrFromNet (conn .RemoteAddr ()),
79+ if udpConn , isUDPConn := conn .(N.EXP_UDPConn ); isUDPConn {
80+ return & UnbindUDPConn {
81+ UnbindPacketConn {
82+ NewExtendedConn (conn ),
83+ M .SocksaddrFromNet (conn .RemoteAddr ()),
84+ },
85+ udpConn ,
86+ }
87+ } else {
88+ return & UnbindPacketConn {
89+ NewExtendedConn (conn ),
90+ M .SocksaddrFromNet (conn .RemoteAddr ()),
91+ }
6792 }
6893}
6994
7095func NewUnbindPacketConnWithAddr (conn net.Conn , addr M.Socksaddr ) N.NetPacketConn {
71- return & UnbindPacketConn {
72- NewExtendedConn (conn ),
73- addr ,
96+ if udpConn , isUDPConn := conn .(N.EXP_UDPConn ); isUDPConn {
97+ return & UnbindUDPConn {
98+ UnbindPacketConn {
99+ NewExtendedConn (conn ),
100+ addr ,
101+ },
102+ udpConn ,
103+ }
104+ } else {
105+ return & UnbindPacketConn {
106+ NewExtendedConn (conn ),
107+ addr ,
108+ }
74109 }
75110}
76111
@@ -110,3 +145,38 @@ func (c *UnbindPacketConn) CreateReadWaiter() (N.PacketReadWaiter, bool) {
110145func (c * UnbindPacketConn ) Upstream () any {
111146 return c .ExtendedConn
112147}
148+
149+ var _ N.EXP_UDPConn = (* UnbindUDPConn )(nil )
150+
151+ type UnbindUDPConn struct {
152+ UnbindPacketConn
153+ N.EXP_UDPConn
154+ }
155+
156+ func (c * UnbindUDPConn ) ReadFrom (p []byte ) (n int , addr net.Addr , err error ) {
157+ return c .UnbindPacketConn .ReadFrom (p )
158+ }
159+
160+ func (c * UnbindUDPConn ) WriteTo (p []byte , _ net.Addr ) (n int , err error ) {
161+ return c .ExtendedConn .Write (p )
162+ }
163+
164+ func (c * UnbindUDPConn ) ReadPacket (buffer * buf.Buffer ) (destination M.Socksaddr , err error ) {
165+ return c .UnbindPacketConn .ReadPacket (buffer )
166+ }
167+
168+ func (c * UnbindUDPConn ) WritePacket (buffer * buf.Buffer , _ M.Socksaddr ) error {
169+ return c .ExtendedConn .WriteBuffer (buffer )
170+ }
171+
172+ func (c * UnbindUDPConn ) ReadMsgUDP (b , oob []byte ) (n , oobn , flags int , addr * net.UDPAddr , err error ) {
173+ n , oobn , flags , addr , err = c .EXP_UDPConn .ReadMsgUDP (b , oob )
174+ if err == nil {
175+ addr = c .addr .UDPAddr ()
176+ }
177+ return
178+ }
179+
180+ func (c * UnbindUDPConn ) WriteMsgUDP (b , oob []byte , _ * net.UDPAddr ) (n , oobn int , err error ) {
181+ return c .EXP_UDPConn .WriteMsgUDP (b , oob , c .addr .UDPAddr ())
182+ }
0 commit comments