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) } }
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 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 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 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()) }