| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768 |
- 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 {
- ipCopy := make([]byte, len(ip))
- copy(ipCopy, ip)
- // TODO: check IP length
- return Address{
- Type: AddrTypeIP,
- IP: net.IP(ipCopy),
- Domain: "",
- Port: port,
- }
- }
- func DomainAddress(domain string, port uint16) Address {
- return Address{
- Type: AddrTypeDomain,
- IP: nil,
- Domain: domain,
- Port: 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))
- }
|