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 ""
}