@@ -250,7 +250,7 @@ func (d *ProtectedDialer) Dial(ctx context.Context,
250
250
}
251
251
252
252
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 )
254
254
if err != nil {
255
255
d .vServer .NextIP ()
256
256
return nil , err
@@ -273,14 +273,14 @@ func (d *ProtectedDialer) Dial(ctx context.Context,
273
273
274
274
// use the first resolved address.
275
275
// 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 )
277
277
}
278
278
279
279
func (d * ProtectedDialer ) DestIpAddress () net.IP {
280
280
return d .vServer .currentIP ()
281
281
}
282
282
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 ) {
284
284
285
285
defer unix .Close (fd )
286
286
@@ -295,9 +295,16 @@ func (d *ProtectedDialer) fdConn(ctx context.Context, ip net.IP, port int, fd in
295
295
}
296
296
copy (sa .Addr [:], ip .To16 ())
297
297
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
+ }
301
308
}
302
309
303
310
file := os .NewFile (uintptr (fd ), "Socket" )
@@ -308,11 +315,25 @@ func (d *ProtectedDialer) fdConn(ctx context.Context, ip net.IP, port int, fd in
308
315
309
316
defer file .Close ()
310
317
//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
315
338
}
316
-
317
- return conn , nil
318
339
}
0 commit comments