Skip to content

Commit 2df580b

Browse files
committed
2 parents 7489dee + 97ef211 commit 2df580b

File tree

1 file changed

+33
-12
lines changed

1 file changed

+33
-12
lines changed

AndroidLibXrayLite/libv2ray_support.go

Lines changed: 33 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -250,7 +250,7 @@ func (d *ProtectedDialer) Dial(ctx context.Context,
250250
}
251251

252252
curIP := d.vServer.currentIP()
253-
conn, err := d.fdConn(ctx, curIP, d.vServer.Port, fd)
253+
conn, err := d.fdConn(ctx, curIP, d.vServer.Port, dest.Network, fd)
254254
if err != nil {
255255
d.vServer.NextIP()
256256
return nil, err
@@ -273,14 +273,14 @@ func (d *ProtectedDialer) Dial(ctx context.Context,
273273

274274
// use the first resolved address.
275275
// the result IP may vary, eg: IPv6 addrs comes first if client has ipv6 address
276-
return d.fdConn(ctx, resolved.IPs[0], resolved.Port, fd)
276+
return d.fdConn(ctx, resolved.IPs[0], resolved.Port, dest.Network, fd)
277277
}
278278

279279
func (d *ProtectedDialer) DestIpAddress() net.IP {
280280
return d.vServer.currentIP()
281281
}
282282

283-
func (d *ProtectedDialer) fdConn(ctx context.Context, ip net.IP, port int, fd int) (net.Conn, error) {
283+
func (d *ProtectedDialer) fdConn(ctx context.Context, ip net.IP, port int, network v2net.Network, fd int) (net.Conn, error) {
284284

285285
defer unix.Close(fd)
286286

@@ -295,9 +295,16 @@ func (d *ProtectedDialer) fdConn(ctx context.Context, ip net.IP, port int, fd in
295295
}
296296
copy(sa.Addr[:], ip.To16())
297297

298-
if err := unix.Connect(fd, sa); err != nil {
299-
log.Printf("fdConn unix.Connect err, Close Fd: %d Err: %v", fd, err)
300-
return nil, err
298+
if network == v2net.Network_UDP {
299+
if err := unix.Bind(fd, &unix.SockaddrInet6{}); err != nil {
300+
log.Printf("fdConn unix.Bind err, Close Fd: %d Err: %v", fd, err)
301+
return nil, err
302+
}
303+
} else {
304+
if err := unix.Connect(fd, sa); err != nil {
305+
log.Printf("fdConn unix.Connect err, Close Fd: %d Err: %v", fd, err)
306+
return nil, err
307+
}
301308
}
302309

303310
file := os.NewFile(uintptr(fd), "Socket")
@@ -308,11 +315,25 @@ func (d *ProtectedDialer) fdConn(ctx context.Context, ip net.IP, port int, fd in
308315

309316
defer file.Close()
310317
//Closing conn does not affect file, and closing file does not affect conn.
311-
conn, err := net.FileConn(file)
312-
if err != nil {
313-
log.Printf("fdConn FileConn Close Fd: %d Err: %v", fd, err)
314-
return nil, err
318+
if network == v2net.Network_UDP {
319+
packetConn, err := net.FilePacketConn(file)
320+
if err != nil {
321+
log.Printf("fdConn FilePacketConn Close Fd: %d Err: %v", fd, err)
322+
return nil, err
323+
}
324+
return &v2internet.PacketConnWrapper{
325+
Conn: packetConn,
326+
Dest: &net.UDPAddr{
327+
IP: ip,
328+
Port: port,
329+
},
330+
}, nil
331+
} else {
332+
conn, err := net.FileConn(file)
333+
if err != nil {
334+
log.Printf("fdConn FileConn Close Fd: %d Err: %v", fd, err)
335+
return nil, err
336+
}
337+
return conn, nil
315338
}
316-
317-
return conn, nil
318339
}

0 commit comments

Comments
 (0)