You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
123 lines
2.5 KiB
Go
123 lines
2.5 KiB
Go
3 years ago
|
package icsnet
|
||
|
|
||
|
import (
|
||
|
"fmt"
|
||
|
"net"
|
||
|
"strconv"
|
||
|
"strings"
|
||
|
|
||
|
"gitlab.com/ics_cinnamon/voicegateway/icserror"
|
||
|
)
|
||
|
|
||
|
type IcsNetAddr struct {
|
||
|
IPv4 []byte
|
||
|
IPv4String string
|
||
|
Port int
|
||
|
}
|
||
|
|
||
|
func NewNetAddr() IcsNetAddr {
|
||
|
addr := IcsNetAddr{}
|
||
|
addr.IPv4 = make([]byte, 4)
|
||
|
|
||
|
return addr
|
||
|
}
|
||
|
|
||
|
//format 123.123.123.123:9999
|
||
|
func NewNetAddrWithIPAddr(ipaddr string) IcsNetAddr {
|
||
|
addr := IcsNetAddr{}
|
||
|
addr.IPv4 = make([]byte, 4)
|
||
|
|
||
|
spl := strings.Split(ipaddr, ":")
|
||
|
addr.SetIPv4String(spl[0])
|
||
|
var err error
|
||
|
addr.Port, err = strconv.Atoi(spl[1])
|
||
|
if err != nil {
|
||
|
addr.Port = 0
|
||
|
}
|
||
|
|
||
|
return addr
|
||
|
}
|
||
|
|
||
|
func NewNetAddrWithIPPort(ip string, port int) IcsNetAddr {
|
||
|
addr := IcsNetAddr{}
|
||
|
addr.IPv4 = make([]byte, 4)
|
||
|
|
||
|
addr.SetIPv4String(ip)
|
||
|
addr.SetPort(port)
|
||
|
|
||
|
return addr
|
||
|
}
|
||
|
|
||
|
func NewIcsNetAddrWithUDPAddr(addr *net.UDPAddr) *IcsNetAddr {
|
||
|
icsaddr := &IcsNetAddr{}
|
||
|
icsaddr.IPv4 = make([]byte, 4)
|
||
|
|
||
|
icsaddr.SetIPv4String(addr.IP.String())
|
||
|
icsaddr.SetPort(addr.Port)
|
||
|
|
||
|
//fmt.Println(">>>>", icsaddr)
|
||
|
return icsaddr
|
||
|
}
|
||
|
|
||
|
func NewIcsNetAddrWithTCPAddr(addr *net.TCPAddr) *IcsNetAddr {
|
||
|
icsaddr := &IcsNetAddr{}
|
||
|
icsaddr.IPv4 = make([]byte, 4)
|
||
|
|
||
|
ip, sport, _ := net.SplitHostPort(addr.IP.String())
|
||
|
port, _ := strconv.Atoi(sport)
|
||
|
icsaddr.SetIPv4String(ip)
|
||
|
icsaddr.SetPort(port)
|
||
|
|
||
|
return icsaddr
|
||
|
}
|
||
|
|
||
|
func (a *IcsNetAddr) SetIPv4(ip []byte) {
|
||
|
copy(a.IPv4, ip)
|
||
|
a.IPv4String = fmt.Sprintf("%d.%d.%d.%d", a.IPv4[0], a.IPv4[1], a.IPv4[2], a.IPv4[3])
|
||
|
}
|
||
|
|
||
|
func (a *IcsNetAddr) SetIPv4String(ip string) {
|
||
|
a.IPv4String = ip
|
||
|
|
||
|
no := strings.Split(ip, ".")
|
||
|
for iter, b := range no {
|
||
|
i, err := strconv.Atoi(b)
|
||
|
if err != nil {
|
||
|
i = 0
|
||
|
}
|
||
|
|
||
|
a.IPv4[iter] = byte(i)
|
||
|
}
|
||
|
}
|
||
|
|
||
|
func (a *IcsNetAddr) SetPort(port int) {
|
||
|
a.Port = port
|
||
|
}
|
||
|
|
||
|
func (a IcsNetAddr) String() string {
|
||
|
strAddr := fmt.Sprintf("%d.%d.%d.%d:%d", a.IPv4[0], a.IPv4[1], a.IPv4[2], a.IPv4[3], a.Port)
|
||
|
return strAddr
|
||
|
}
|
||
|
|
||
|
func (a IcsNetAddr) ResolveIcsNetAddr(network string) (interface{}, *icserror.IcsError) {
|
||
|
ip := fmt.Sprintf("%d.%d.%d.%d:%d", a.IPv4[0], a.IPv4[1], a.IPv4[2], a.IPv4[3], a.Port)
|
||
|
|
||
|
if strings.Compare("tcp", network) == 0 {
|
||
|
addr, err := net.ResolveTCPAddr("tcp", ip)
|
||
|
if err != nil {
|
||
|
icserror.ICSERRNETResolveAddrError.SetError(err)
|
||
|
return nil, icserror.ICSERRNETResolveAddrError
|
||
|
}
|
||
|
return interface{}(*addr), nil
|
||
|
} else if strings.Compare("udp", network) == 0 {
|
||
|
addr, err := net.ResolveUDPAddr("udp", ip)
|
||
|
if err != nil {
|
||
|
icserror.ICSERRNETResolveAddrError.SetError(err)
|
||
|
return nil, icserror.ICSERRNETResolveAddrError
|
||
|
}
|
||
|
return interface{}(*addr), nil
|
||
|
}
|
||
|
|
||
|
return nil, nil
|
||
|
}
|