mirror of
				https://github.com/nadoo/glider.git
				synced 2025-10-31 22:05:51 +08:00 
			
		
		
		
	proxy: improve interface binding (by setsockopt) on linux
This commit is contained in:
		
							parent
							
								
									5b1a127d04
								
							
						
					
					
						commit
						39ae201afe
					
				
							
								
								
									
										14
									
								
								proxy/bind_linux.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										14
									
								
								proxy/bind_linux.go
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,14 @@ | |||||||
|  | package proxy | ||||||
|  | 
 | ||||||
|  | import ( | ||||||
|  | 	"net" | ||||||
|  | 	"syscall" | ||||||
|  | ) | ||||||
|  | 
 | ||||||
|  | func bind(dialer *net.Dialer, iface *net.Interface) { | ||||||
|  | 	dialer.Control = func(network, address string, c syscall.RawConn) error { | ||||||
|  | 		return c.Control(func(fd uintptr) { | ||||||
|  | 			syscall.BindToDevice(int(fd), iface.Name) | ||||||
|  | 		}) | ||||||
|  | 	} | ||||||
|  | } | ||||||
							
								
								
									
										8
									
								
								proxy/bind_others.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										8
									
								
								proxy/bind_others.go
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,8 @@ | |||||||
|  | //go:build !linux
 | ||||||
|  | // +build !linux
 | ||||||
|  | 
 | ||||||
|  | package proxy | ||||||
|  | 
 | ||||||
|  | import "net" | ||||||
|  | 
 | ||||||
|  | func bind(dialer *net.Dialer, iface *net.Interface) {} | ||||||
| @ -33,9 +33,6 @@ func NewDirect(intface string, dialTimeout, relayTimeout time.Duration) (*Direct | |||||||
| 				return nil, errors.New(err.Error() + ": " + intface) | 				return nil, errors.New(err.Error() + ": " + intface) | ||||||
| 			} | 			} | ||||||
| 			d.iface = iface | 			d.iface = iface | ||||||
| 			if ips := d.IFaceIPs(); len(ips) > 0 { |  | ||||||
| 				d.ip = ips[0] |  | ||||||
| 			} |  | ||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| @ -88,6 +85,10 @@ func (d *Direct) dial(network, addr string, localIP net.IP) (net.Conn, error) { | |||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	dialer := &net.Dialer{LocalAddr: la, Timeout: d.dialTimeout} | 	dialer := &net.Dialer{LocalAddr: la, Timeout: d.dialTimeout} | ||||||
|  | 	if d.iface != nil { | ||||||
|  | 		bind(dialer, d.iface) | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
| 	c, err := dialer.Dial(network, addr) | 	c, err := dialer.Dial(network, addr) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return nil, err | 		return nil, err | ||||||
|  | |||||||
| @ -47,7 +47,7 @@ type chunkedReader struct { | |||||||
| 
 | 
 | ||||||
| // ChunkedReader returns a chunked reader.
 | // ChunkedReader returns a chunked reader.
 | ||||||
| func ChunkedReader(r io.Reader, chunkSizeDecoder ChunkSizeDecoder) io.Reader { | func ChunkedReader(r io.Reader, chunkSizeDecoder ChunkSizeDecoder) io.Reader { | ||||||
| 	return &chunkedReader{Reader: r, chunkSizeDecoder: chunkSizeDecoder} | 	return &chunkedReader{Reader: r, chunkSizeDecoder: chunkSizeDecoder, buf: make([]byte, chunkSizeDecoder.SizeBytes())} | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| func (r *chunkedReader) Read(p []byte) (int, error) { | func (r *chunkedReader) Read(p []byte) (int, error) { | ||||||
|  | |||||||
		Loading…
	
		Reference in New Issue
	
	Block a user
	 nadoo
						nadoo