mirror of
				https://github.com/nadoo/glider.git
				synced 2025-11-04 07:42:38 +08:00 
			
		
		
		
	uottun: add udp over tcp local server support
This commit is contained in:
		
							parent
							
								
									e32bf1a0f6
								
							
						
					
					
						commit
						0e8263ddfa
					
				
							
								
								
									
										68
									
								
								uottun.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										68
									
								
								uottun.go
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,68 @@
 | 
			
		||||
package main
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"io/ioutil"
 | 
			
		||||
	"net"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
// UoTTun udp over tcp tunnel
 | 
			
		||||
type UoTTun struct {
 | 
			
		||||
	*Forwarder
 | 
			
		||||
	sDialer Dialer
 | 
			
		||||
 | 
			
		||||
	raddr string
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// NewUoTTun returns a UoTTun proxy.
 | 
			
		||||
func NewUoTTun(addr, raddr string, sDialer Dialer) (*UoTTun, error) {
 | 
			
		||||
	s := &UoTTun{
 | 
			
		||||
		Forwarder: NewForwarder(addr, nil),
 | 
			
		||||
		sDialer:   sDialer,
 | 
			
		||||
		raddr:     raddr,
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return s, nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// ListenAndServe redirected requests as a server.
 | 
			
		||||
func (s *UoTTun) ListenAndServe() {
 | 
			
		||||
 | 
			
		||||
	c, err := net.ListenPacket("udp", s.addr)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		logf("proxy-uottun failed to listen on %s: %v", s.addr, err)
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
	defer c.Close()
 | 
			
		||||
 | 
			
		||||
	logf("proxy-uottun listening UDP on %s", s.addr)
 | 
			
		||||
 | 
			
		||||
	buf := make([]byte, udpBufSize)
 | 
			
		||||
 | 
			
		||||
	for {
 | 
			
		||||
		n, clientAddr, err := c.ReadFrom(buf)
 | 
			
		||||
		if err != nil {
 | 
			
		||||
			logf("proxy-uottun read error: %v", err)
 | 
			
		||||
			continue
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		// NOTE: acturally udp over tcp
 | 
			
		||||
		rc, err := s.sDialer.Dial("udp", s.raddr)
 | 
			
		||||
		if err != nil {
 | 
			
		||||
			logf("failed to connect to server %v: %v", s.raddr, err)
 | 
			
		||||
			continue
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		rc.Write(buf[:n])
 | 
			
		||||
 | 
			
		||||
		resp, err := ioutil.ReadAll(rc)
 | 
			
		||||
		if err != nil {
 | 
			
		||||
			logf("error in ioutil.ReadAll: %s\n", err)
 | 
			
		||||
			return
 | 
			
		||||
		}
 | 
			
		||||
		rc.Close()
 | 
			
		||||
 | 
			
		||||
		c.WriteTo(resp, clientAddr)
 | 
			
		||||
 | 
			
		||||
		logf("proxy-uottun %s <-> %s", clientAddr, s.raddr)
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
		Loading…
	
		Reference in New Issue
	
	Block a user