1
0
mirror of https://github.com/v2fly/v2ray-core.git synced 2024-09-27 22:36:12 -04:00

dispatch udp response

This commit is contained in:
V2Ray 2015-09-28 21:32:07 +02:00
parent 05b83508f8
commit 544b99b1a6
2 changed files with 31 additions and 6 deletions

View File

@ -12,11 +12,11 @@ func NewTCPPacket(dest Destination) *TCPPacket {
} }
} }
func NewUDPPacket(dest Destination, data []byte, id uint16) *UDPPacket { func NewUDPPacket(dest Destination, data []byte, token uint16) *UDPPacket {
return &UDPPacket{ return &UDPPacket{
basePacket: basePacket{destination: dest}, basePacket: basePacket{destination: dest},
data: data, data: data,
id: id, token: token,
} }
} }
@ -42,12 +42,12 @@ func (packet *TCPPacket) MoreChunks() bool {
type UDPPacket struct { type UDPPacket struct {
basePacket basePacket
data []byte data []byte
id uint16 token uint16
} }
func (packet *UDPPacket) ID() uint16 { func (packet *UDPPacket) Token() uint16 {
return packet.id return packet.token
} }
func (packet *UDPPacket) Chunk() []byte { func (packet *UDPPacket) Chunk() []byte {

View File

@ -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
}