|  | @@ -558,60 +558,6 @@ func (l *Listener) Addr() net.Addr {
 | 
	
		
			
				|  |  |  	return l.conn.LocalAddr()
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -// Listen listens for incoming KCP packets addressed to the local address laddr on the network "udp",
 | 
	
		
			
				|  |  | -func Listen(laddr string) (*Listener, error) {
 | 
	
		
			
				|  |  | -	return ListenWithOptions(laddr, nil)
 | 
	
		
			
				|  |  | -}
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -// ListenWithOptions listens for incoming KCP packets addressed to the local address laddr on the network "udp" with packet encryption,
 | 
	
		
			
				|  |  | -// FEC = 0 means no FEC, FEC > 0 means num(FEC) as a FEC cluster
 | 
	
		
			
				|  |  | -func ListenWithOptions(laddr string, block BlockCrypt) (*Listener, error) {
 | 
	
		
			
				|  |  | -	udpaddr, err := net.ResolveUDPAddr("udp", laddr)
 | 
	
		
			
				|  |  | -	if err != nil {
 | 
	
		
			
				|  |  | -		return nil, err
 | 
	
		
			
				|  |  | -	}
 | 
	
		
			
				|  |  | -	conn, err := net.ListenUDP("udp", udpaddr)
 | 
	
		
			
				|  |  | -	if err != nil {
 | 
	
		
			
				|  |  | -		return nil, err
 | 
	
		
			
				|  |  | -	}
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -	l := new(Listener)
 | 
	
		
			
				|  |  | -	l.conn = conn
 | 
	
		
			
				|  |  | -	l.sessions = make(map[string]*UDPSession)
 | 
	
		
			
				|  |  | -	l.chAccepts = make(chan *UDPSession, 1024)
 | 
	
		
			
				|  |  | -	l.chDeadlinks = make(chan net.Addr, 1024)
 | 
	
		
			
				|  |  | -	l.die = make(chan struct{})
 | 
	
		
			
				|  |  | -	l.block = block
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -	// caculate header size
 | 
	
		
			
				|  |  | -	if l.block != nil {
 | 
	
		
			
				|  |  | -		l.headerSize += cryptHeaderSize
 | 
	
		
			
				|  |  | -	}
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -	go l.monitor()
 | 
	
		
			
				|  |  | -	return l, nil
 | 
	
		
			
				|  |  | -}
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -// Dial connects to the remote address raddr on the network "udp"
 | 
	
		
			
				|  |  | -func Dial(raddr string) (*UDPSession, error) {
 | 
	
		
			
				|  |  | -	return DialWithOptions(raddr, nil)
 | 
	
		
			
				|  |  | -}
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -// DialWithOptions connects to the remote address raddr on the network "udp" with packet encryption
 | 
	
		
			
				|  |  | -func DialWithOptions(raddr string, block BlockCrypt) (*UDPSession, error) {
 | 
	
		
			
				|  |  | -	udpaddr, err := net.ResolveUDPAddr("udp", raddr)
 | 
	
		
			
				|  |  | -	if err != nil {
 | 
	
		
			
				|  |  | -		return nil, err
 | 
	
		
			
				|  |  | -	}
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -	for {
 | 
	
		
			
				|  |  | -		port := basePort + rand.Int()%(maxPort-basePort)
 | 
	
		
			
				|  |  | -		if udpconn, err := net.ListenUDP("udp", &net.UDPAddr{Port: port}); err == nil {
 | 
	
		
			
				|  |  | -			return newUDPSession(rand.Uint32(), nil, udpconn, udpaddr, block), nil
 | 
	
		
			
				|  |  | -		}
 | 
	
		
			
				|  |  | -	}
 | 
	
		
			
				|  |  | -}
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  |  func currentMs() uint32 {
 | 
	
		
			
				|  |  |  	return uint32(time.Now().UnixNano() / int64(time.Millisecond))
 | 
	
		
			
				|  |  |  }
 |