func (this *SocksServer) handlePacket(packet v2net.Packet, clientAddr *net.UDPAddr, targetAddr v2net.Address, port v2net.Port) { ray := this.space.PacketDispatcher().DispatchToOutbound(packet) close(ray.InboundInput()) for data := range ray.InboundOutput() { response := &protocol.Socks5UDPRequest{ Fragment: 0, Address: targetAddr, Port: port, Data: data, } log.Info("Writing back UDP response with %d bytes from %s to %s", data.Len(), targetAddr.String(), clientAddr.String()) udpMessage := alloc.NewSmallBuffer().Clear() response.Write(udpMessage) this.udpMutex.RLock() if !this.accepting { this.udpMutex.RUnlock() return } nBytes, err := this.udpConn.WriteToUDP(udpMessage.Value, clientAddr) this.udpMutex.RUnlock() udpMessage.Release() response.Data.Release() if err != nil { log.Error("Socks failed to write UDP message (%d bytes) to %s: %v", nBytes, clientAddr.String(), err) } } }
func startCommunicate(request *protocol.VMessRequest, dest v2net.Address, ray core.OutboundRay) error { input := ray.OutboundInput() output := ray.OutboundOutput() conn, err := net.DialTCP("tcp", nil, &net.TCPAddr{dest.IP, int(dest.Port), ""}) if err != nil { log.Error("Failed to open tcp (%s): %v", dest.String(), err) close(output) return err } log.Info("VMessOut: Tunneling request for %s", request.Address.String()) defer conn.Close() requestFinish := make(chan bool) responseFinish := make(chan bool) go handleRequest(conn, request, input, requestFinish) go handleResponse(conn, request, output, responseFinish) <-requestFinish conn.CloseWrite() <-responseFinish return nil }
func (this *Assert) Address(value v2net.Address) *AddressSubject { return &AddressSubject{ Subject: Subject{ disp: value.String(), a: this, }, value: value, } }
func ListenRawTCP(address v2net.Address, port v2net.Port) (internet.Listener, error) { listener, err := net.ListenTCP("tcp", &net.TCPAddr{ IP: address.IP(), Port: int(port), }) if err != nil { return nil, err } return &RawTCPListener{ accepting: true, listener: listener, }, nil }
func ListenUDP(address v2net.Address, port v2net.Port, callback UDPPayloadHandler) (*UDPHub, error) { udpConn, err := net.ListenUDP("udp", &net.UDPAddr{ IP: address.IP(), Port: int(port), }) if err != nil { return nil, err } hub := &UDPHub{ conn: udpConn, callback: callback, } go hub.start() return hub, nil }
func ListenTCP(address v2net.Address, port v2net.Port) (internet.Listener, error) { listener, err := net.ListenTCP("tcp", &net.TCPAddr{ IP: address.IP(), Port: int(port), }) if err != nil { return nil, err } l := &TCPListener{ acccepting: true, listener: listener, awaitingConns: make(chan *ConnectionWithError, 32), } go l.KeepAccepting() return l, nil }
func (server *SocksServer) handlePacket(conn *net.UDPConn, packet v2net.Packet, clientAddr *net.UDPAddr, targetAddr v2net.Address) { ray := server.vPoint.DispatchToOutbound(packet) close(ray.InboundInput()) if data, ok := <-ray.InboundOutput(); ok { response := &protocol.Socks5UDPRequest{ Fragment: 0, Address: targetAddr, Data: data, } log.Info("Writing back UDP response with %d bytes from %s to %s", len(data), targetAddr.String(), clientAddr.String()) udpMessage := response.Bytes(nil) nBytes, err := conn.WriteToUDP(udpMessage, clientAddr) if err != nil { log.Error("Socks failed to write UDP message (%d bytes) to %s: %v", nBytes, clientAddr.String(), err) } } }
func NewListener(address v2net.Address, port v2net.Port) (*Listener, error) { l := &Listener{ block: NewSimpleAuthenticator(), sessions: make(map[string]*Connection), awaitingConns: make(chan *Connection, 64), localAddr: &net.UDPAddr{ IP: address.IP(), Port: int(port), }, running: true, } hub, err := udp.ListenUDP(address, port, l.OnReceive) if err != nil { return nil, err } l.hub = hub log.Info("KCP|Listener: listening on ", address, ":", port) return l, nil }
func (server *SocksServer) handlePacket(conn *net.UDPConn, packet v2net.Packet, clientAddr *net.UDPAddr, targetAddr v2net.Address) { ray := server.dispatcher.DispatchToOutbound(packet) close(ray.InboundInput()) for data := range ray.InboundOutput() { response := &protocol.Socks5UDPRequest{ Fragment: 0, Address: targetAddr, Data: data, } log.Info("Writing back UDP response with %d bytes from %s to %s", data.Len(), targetAddr.String(), clientAddr.String()) udpMessage := alloc.NewSmallBuffer().Clear() response.Write(udpMessage) nBytes, err := conn.WriteToUDP(udpMessage.Value, clientAddr) udpMessage.Release() response.Data.Release() if err != nil { log.Error("Socks failed to write UDP message (%d bytes) to %s: %v", nBytes, clientAddr.String(), err) } } }
func DialToDest(src v2net.Address, dest v2net.Destination) (net.Conn, error) { dialer := &net.Dialer{ Timeout: time.Second * 60, DualStack: true, } if src != nil && src != v2net.AnyIP { var addr net.Addr if dest.IsTCP() { addr = &net.TCPAddr{ IP: src.IP(), Port: 0, } } else { addr = &net.UDPAddr{ IP: src.IP(), Port: 0, } } dialer.LocalAddr = addr } return dialer.Dial(dest.Network().String(), dest.NetAddr()) }
func appendAddress(request []byte, address v2net.Address) []byte { switch { case address.IsIPv4(): request = append(request, byte(0x01)) request = append(request, address.IP()...) case address.IsIPv6(): request = append(request, byte(0x04)) request = append(request, address.IP()...) case address.IsDomain(): request = append(request, byte(0x03), byte(len(address.Domain()))) request = append(request, []byte(address.Domain())...) } return request }
func (subject *AddressSubject) Equals(another v2net.Address) { if !subject.value.Equals(another) { subject.Fail("equals to", another.String()) } }
func (subject *AddressSubject) Equals(another v2net.Address) { if subject.value.IsIPv4() && another.IsIPv4() { IP(subject.value.IP()).Equals(another.IP()) } else if subject.value.IsIPv6() && another.IsIPv6() { IP(subject.value.IP()).Equals(another.IP()) } else if subject.value.IsDomain() && another.IsDomain() { assert.StringLiteral(subject.value.Domain()).Equals(another.Domain()) } else { subject.Fail(subject.DisplayString(), "equals to", another) } }