|  | @@ -56,8 +56,21 @@ func (m *portMap) removePorts(removedPorts <-chan interface{}) {
 | 
											
												
													
														|  |  	}
 |  |  	}
 | 
											
												
													
														|  |  }
 |  |  }
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | 
 |  | +func (m *portMap) popPort(token uint16) *net.UDPAddr {
 | 
											
												
													
														|  | 
 |  | +	m.access.Lock()
 | 
											
												
													
														|  | 
 |  | +	defer m.access.Unlock()
 | 
											
												
													
														|  | 
 |  | +	addr, exists := m.data[token]
 | 
											
												
													
														|  | 
 |  | +	if !exists {
 | 
											
												
													
														|  | 
 |  | +		return nil
 | 
											
												
													
														|  | 
 |  | +	}
 | 
											
												
													
														|  | 
 |  | +	delete(m.data, token)
 | 
											
												
													
														|  | 
 |  | +	return addr
 | 
											
												
													
														|  | 
 |  | +}
 | 
											
												
													
														|  | 
 |  | +
 | 
											
												
													
														|  |  var (
 |  |  var (
 | 
											
												
													
														|  |  	ports = newPortMap()
 |  |  	ports = newPortMap()
 | 
											
												
													
														|  | 
 |  | +
 | 
											
												
													
														|  | 
 |  | +	udpConn *net.UDPConn
 | 
											
												
													
														|  |  )
 |  |  )
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  |  func (server *SocksServer) ListenUDP(port uint16) error {
 |  |  func (server *SocksServer) ListenUDP(port uint16) error {
 | 
											
										
											
												
													
														|  | @@ -73,6 +86,7 @@ func (server *SocksServer) ListenUDP(port uint16) error {
 | 
											
												
													
														|  |  	}
 |  |  	}
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  |  	go server.AcceptPackets(conn)
 |  |  	go server.AcceptPackets(conn)
 | 
											
												
													
														|  | 
 |  | +  udpConn = conn
 | 
											
												
													
														|  |  	return nil
 |  |  	return nil
 | 
											
												
													
														|  |  }
 |  |  }
 | 
											
												
													
														|  |  
 |  |  
 | 
											
										
											
												
													
														|  | @@ -100,3 +114,14 @@ func (server *SocksServer) AcceptPackets(conn *net.UDPConn) error {
 | 
											
												
													
														|  |  		server.vPoint.DispatchToOutbound(udpPacket)
 |  |  		server.vPoint.DispatchToOutbound(udpPacket)
 | 
											
												
													
														|  |  	}
 |  |  	}
 | 
											
												
													
														|  |  }
 |  |  }
 | 
											
												
													
														|  | 
 |  | +
 | 
											
												
													
														|  | 
 |  | +func (server *SocksServer) Dispatch(packet v2net.Packet) {
 | 
											
												
													
														|  | 
 |  | +	if udpPacket, ok := packet.(*v2net.UDPPacket); ok {
 | 
											
												
													
														|  | 
 |  | +		token := udpPacket.Token()
 | 
											
												
													
														|  | 
 |  | +		addr := ports.popPort(token)
 | 
											
												
													
														|  | 
 |  | +		if udpConn != nil {
 | 
											
												
													
														|  | 
 |  | +			udpConn.WriteToUDP(udpPacket.Chunk(), addr)
 | 
											
												
													
														|  | 
 |  | +		}
 | 
											
												
													
														|  | 
 |  | +	}
 | 
											
												
													
														|  | 
 |  | +	// We don't expect TCP Packets here
 | 
											
												
													
														|  | 
 |  | +}
 |