| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364 | 
							- package net
 
- import (
 
- 	"net"
 
- 	"strconv"
 
- )
 
- const (
 
- 	AddrTypeIP     = byte(0x01)
 
- 	AddrTypeDomain = byte(0x03)
 
- )
 
- type Address struct {
 
- 	Type   byte
 
- 	IP     net.IP
 
- 	Domain string
 
- 	Port   uint16
 
- }
 
- func IPAddress(ip []byte, port uint16) Address {
 
- 	// TODO: check IP length
 
- 	return Address{
 
- 		AddrTypeIP,
 
- 		net.IP(ip),
 
- 		"",
 
- 		port}
 
- }
 
- func DomainAddress(domain string, port uint16) Address {
 
- 	return Address{
 
- 		AddrTypeDomain,
 
- 		nil,
 
- 		domain,
 
- 		port}
 
- }
 
- func (addr Address) IsIPv4() bool {
 
- 	return addr.Type == AddrTypeIP && len(addr.IP) == net.IPv4len
 
- }
 
- func (addr Address) IsIPv6() bool {
 
- 	return addr.Type == AddrTypeIP && len(addr.IP) == net.IPv6len
 
- }
 
- func (addr Address) IsDomain() bool {
 
- 	return addr.Type == AddrTypeDomain
 
- }
 
- func (addr Address) String() string {
 
- 	var host string
 
- 	switch addr.Type {
 
- 	case AddrTypeIP:
 
- 		host = addr.IP.String()
 
- 		if len(addr.IP) == net.IPv6len {
 
- 			host = "[" + host + "]"
 
- 		}
 
- 	case AddrTypeDomain:
 
- 		host = addr.Domain
 
- 	default:
 
- 		panic("Unknown Address Type " + strconv.Itoa(int(addr.Type)))
 
- 	}
 
- 	return host + ":" + strconv.Itoa(int(addr.Port))
 
- }
 
 
  |