mirror of
https://github.com/v2fly/v2ray-core.git
synced 2025-01-02 15:36:41 -05:00
UDP handler in VMess in.
This commit is contained in:
parent
6f433f5206
commit
820da78f92
@ -20,6 +20,11 @@ type VMessUDP struct {
|
|||||||
data []byte
|
data []byte
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (message *VMessUDP) ToPacket() v2net.Packet {
|
||||||
|
dest := v2net.NewUDPDestination(message.address)
|
||||||
|
return v2net.NewPacket(dest, message.data, false)
|
||||||
|
}
|
||||||
|
|
||||||
func ReadVMessUDP(buffer []byte, userset user.UserSet) (*VMessUDP, error) {
|
func ReadVMessUDP(buffer []byte, userset user.UserSet) (*VMessUDP, error) {
|
||||||
userHash := buffer[:user.IDBytesLen]
|
userHash := buffer[:user.IDBytesLen]
|
||||||
userId, timeSec, valid := userset.GetUser(userHash)
|
userId, timeSec, valid := userset.GetUser(userHash)
|
||||||
|
57
proxy/vmess/vmessin_udp.go
Normal file
57
proxy/vmess/vmessin_udp.go
Normal file
@ -0,0 +1,57 @@
|
|||||||
|
package vmess
|
||||||
|
|
||||||
|
import (
|
||||||
|
"net"
|
||||||
|
|
||||||
|
"github.com/v2ray/v2ray-core/common/log"
|
||||||
|
v2net "github.com/v2ray/v2ray-core/common/net"
|
||||||
|
"github.com/v2ray/v2ray-core/proxy/vmess/protocol"
|
||||||
|
)
|
||||||
|
|
||||||
|
const (
|
||||||
|
bufferSize = 2 * 1024
|
||||||
|
)
|
||||||
|
|
||||||
|
func (handler *VMessInboundHandler) ListenUDP(port uint16) error {
|
||||||
|
addr := &net.UDPAddr{
|
||||||
|
IP: net.IP{0, 0, 0, 0},
|
||||||
|
Port: int(port),
|
||||||
|
Zone: "",
|
||||||
|
}
|
||||||
|
conn, err := net.ListenUDP("udp", addr)
|
||||||
|
if err != nil {
|
||||||
|
log.Error("VMessIn failed to listen UDP on port %d: %v", port, err)
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
go handler.AcceptPackets(conn)
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (handler *VMessInboundHandler) AcceptPackets(conn *net.UDPConn) error {
|
||||||
|
for {
|
||||||
|
buffer := make([]byte, 0, bufferSize)
|
||||||
|
nBytes, addr, err := conn.ReadFromUDP(buffer)
|
||||||
|
if err != nil {
|
||||||
|
log.Error("VMessIn failed to read UDP packets: %v", err)
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
request, err := protocol.ReadVMessUDP(buffer[:nBytes], handler.clients)
|
||||||
|
if err != nil {
|
||||||
|
log.Error("VMessIn failed to parse UDP request: %v", err)
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
udpPacket := request.ToPacket()
|
||||||
|
go handler.handlePacket(conn, udpPacket, addr)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (handler *VMessInboundHandler) handlePacket(conn *net.UDPConn, packet v2net.Packet, clientAddr *net.UDPAddr) {
|
||||||
|
ray := handler.vPoint.DispatchToOutbound(packet)
|
||||||
|
close(ray.InboundInput())
|
||||||
|
|
||||||
|
if data, ok := <-ray.InboundOutput(); ok {
|
||||||
|
conn.WriteToUDP(data, clientAddr)
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user