network - skynocover/Wiki-for-GoLang GitHub Wiki
network
// InitializeNetworks Init the Network config
func InitializeNetworks() {
BroadcastAddresses = &sync.Map{}
MyAddresses = &sync.Map{}
infs, err := net.Interfaces()
if err != nil {
return
}
for _, inf := range infs {
if inf.Name != TomlConfig.ProxyServer[Env].MainInterface { // eho0 ens160
continue
}
addrs, err := inf.Addrs()
if err != nil {
continue
}
for _, addr := range addrs {
ipnet := addr.(*net.IPNet)
broadcastAddress := GetBroadcastAddress(ipnet)
if broadcastAddress != "" {
addressBytes := ipnet.IP.To4()
myIP := fmt.Sprintf("%d.%d.%d.%d", addressBytes[0], addressBytes[1], addressBytes[2], addressBytes[3])
Log("myIP: " + myIP)
MyAddresses.LoadOrStore(myIP, 0)
ipPort := fmt.Sprintf("%s:%d", broadcastAddress, TomlConfig.ProxyServer[Env].BroadcastPort)
Log("BroadcastAdd: " + ipPort)
BroadcastAddresses.LoadOrStore(myIP, ipPort)
}
}
}
}
func GetBroadcastAddress(ipnet *net.IPNet) string {
chkIpv4 := ipnet.IP.To4()
if chkIpv4 != nil && !chkIpv4.IsLoopback() {
ones, bits := chkIpv4.DefaultMask().Size()
rb := bits - ones
v := binary.BigEndian.Uint32(chkIpv4)
vb := ""
for i := 0; i < rb; i++ {
vb += "1"
}
vp, _ := strconv.ParseUint(vb, 2, 32)
vv := v | uint32(vp)
bt := []byte{0, 0, 0, 0}
binary.BigEndian.PutUint32(bt, vv)
return fmt.Sprintf("%d.%d.%d.%d", bt[0], bt[1], bt[2], bt[3])
}
return ""
}