1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283 |
- package ip
- import (
- "dhcp/code"
- "dhcp/result"
- "errors"
- "fmt"
- "net"
- )
- // DetectPublicIPv4 获取公网IP
- func DetectPublicIPv4(extra string) string {
- ip, err := autoDetectPublicIPv4()
- if err != nil {
- return ""
- }
- return fmt.Sprintf("%v%v", ip.String(), extra)
- }
- // autoDetectPublicIPv4 自动检测公网IP
- func autoDetectPublicIPv4() (net.IP, error) {
- ifaces, err := net.Interfaces()
- if err != nil {
- return nil, err
- }
- for i := 0; i < len(ifaces); i++ {
- if (ifaces[i].Flags & net.FlagUp) == 0 {
- continue
- }
- addrs, _ := ifaces[i].Addrs()
- for _, address := range addrs {
- ipnet, ok := address.(*net.IPNet)
- if ok && !ipnet.IP.IsLoopback() && ipnet.IP.To4() != nil {
- return ipnet.IP, nil
- }
- }
- }
- return nil, errors.New("unable to auto-detect public IPv4")
- }
- // GetLocalIPAndInterface 获取本地IP和网络接口
- func GetLocalIPAndInterface() result.Result {
- type IPAddInterface struct {
- IP string `json:"ip"`
- Interface string `json:"interface"`
- }
- var ipAddInterfaces []IPAddInterface
- // 获取所有网络接口
- ifaces, err := net.Interfaces()
- if err != nil {
- return result.Result{
- Status: false,
- Code: code.SystemException,
- Msg: "获取网络接口失败",
- }
- }
- for i := 0; i < len(ifaces); i++ {
- if (ifaces[i].Flags & net.FlagUp) == 0 {
- continue
- }
- addrs, _ := ifaces[i].Addrs()
- for _, address := range addrs {
- ipnet, ok := address.(*net.IPNet)
- if ok && !ipnet.IP.IsLoopback() && ipnet.IP.To4() != nil {
- ipface := IPAddInterface{
- IP: ipnet.IP.String(),
- Interface: ifaces[i].Name,
- }
- ipAddInterfaces = append(ipAddInterfaces, ipface)
- }
- }
- }
- return result.Result{
- Status: true,
- Code: code.SUCCESS,
- Msg: "获取网络接口成功",
- Data: ipAddInterfaces,
- }
- }
|