note.wcoder.com
wcoder GitHub

// https://stackoverflow.com/questions/36347807/how-to-monitor-ip-address-change-using-rtnetlink-socket-in-go-language
// https://www.coder.work/article/204242#google_vignette

// Subscribe to receive link events
// if err := conn.SetSubscribe(netlink.SubscriptionOptions{
// 	Messages: []netlink.MessageType{
// 		netlink.RTM_NEWLINK, // New link detected
// 		netlink.RTM_DELLINK, // Link removed
// 		netlink.RTM_CHGADDR, // Address change
// 	},
// }); err != nil {
// 	log.Fatalf("Failed to set subscription: %v", err)
// }

// "github.com/vishvananda/netlink"
// 设置过滤条件,只关注网络接口事件
// filter := &netlink.RouteSubscribe{
// 	Groups: []uint{
// 		netlink.RTNLGRP_LINK,
// 	},
// }
// if err := conn.SetSubscribe(filter); err != nil {
// 	log.Fatalf("Failed to set subscription: %v", err)
// }

// // 设置过滤器,只接收网卡相关的事件
// filter := &netlink.GenericNetlinkFamily{
// 	Family: unix.NETLINK_ROUTE,
// 	Groups: netlink.RTNLGRP_LINK,
// }
// if err := conn.SetSubscribe(filter); err != nil {
// 	log.Fatalf("Error setting subscription: %v", err)
// }

// 循环读取事件
// for {
// 	msgs, err := conn.Receive()
// 	if err != nil {
// 		log.Printf("Error receiving message: %v", err)
// 		continue
// 	}
// 	for _, m := range msgs {
// 		linkMsg, ok := m.Data.(*netlink.LinkMessage)
// 		if !ok {
// 			log.Printf("Unexpected message type: %T", m.Data)
// 			continue
// 		}
// 		log.Printf("Link event: %+v", linkMsg)
// 		// 根据linkMsg分析网卡添加、删除或配置变化等事件
// 	}
// }

// 添加一个接收消息的通道
// msgs, err := conn.Receive()
// if err != nil {
// 	log.Fatalf("Failed to start receiving messages: %v", err)
// 	return
// }
// // 定义一个处理函数来处理接收到的消息
// go func() {
// 	for {
// 		select {
// 		case msg := <-msgs:
// 			switch msg.Header.Type {
// 			case netlink.RTM_NEWLINK, netlink.RTM_DELLINK, netlink.RTM_CHANGELINK:
// 				link, ok := msg.Data.(*netlink.LinkMessage)
// 				if !ok {
// 					log.Printf("Received unexpected message type: %d", msg.Header.Type)
// 					continue
// 				}

// 				// 根据消息类型打印网卡变化信息
// 				linkType := ""
// 				switch msg.Header.Type {
// 				case unix.RTM_NEWLINK:
// 					linkType = "created"
// 				case unix.RTM_DELLINK:
// 					linkType = "deleted"
// 				case unix.RTM_CHANGELINK: netlink.RTM_CHGADDR
// 					linkType = "changed"
// 				}
// 				fmt.Printf("Interface %s %s\n", link.Attributes.Name, linkType)

// 				// 这里可以进一步处理网卡变化,比如获取详细的网卡信息等
// 			default:
// 				// 忽略其他类型的消息
// 			}
// 		}
// 	}
// }()
← Previous Next →
Less
More