package main import ( "fmt" "log" "os" "os/signal" "syscall" "time" "git.kingecg.top/kingecg/vnic" ) func main() { // 创建虚拟网卡配置 config := vnic.Config{ IP: "192.168.100.1/24", // 设置虚拟网卡的IP地址和子网掩码 } // 创建虚拟网卡 log.Println("正在创建虚拟网卡...") nic, err := vnic.New(config) if err != nil { log.Fatalf("创建虚拟网卡失败: %v", err) } // 确保程序退出时关闭虚拟网卡 defer func() { log.Println("正在关闭虚拟网卡...") if err := nic.Close(); err != nil { log.Printf("关闭虚拟网卡时出错: %v", err) } }() log.Printf("虚拟网卡创建成功,接口名称: %s", nic.Name()) // 创建一个通道来监听系统信号 sigCh := make(chan os.Signal, 1) signal.Notify(sigCh, syscall.SIGINT, syscall.SIGTERM) // 启动一个goroutine来读取数据包 go func() { buffer := make([]byte, 2000) for { n, err := nic.Read(buffer) if err != nil { log.Printf("读取数据包时出错: %v", err) return } log.Printf("收到数据包: %d 字节", n) // 在实际应用中,这里可以解析和处理IP数据包 // 例如:解析IP头部、提取源/目标地址等 } }() // 每隔5秒发送一个测试数据包 go func() { // 创建一个简单的ICMP Echo请求数据包(ping) // 注意:这只是一个示例,实际上这个数据包格式不完整 icmpPacket := []byte{ 0x45, 0x00, 0x00, 0x1c, // IP头: 版本、服务类型、总长度 0x12, 0x34, 0x00, 0x00, // IP头: 标识、标志、片偏移 0x40, 0x01, 0x00, 0x00, // IP头: TTL、协议(ICMP=1)、校验和 0xc0, 0xa8, 0x64, 0x01, // IP头: 源IP (192.168.100.1) 0xc0, 0xa8, 0x64, 0x02, // IP头: 目标IP (192.168.100.2) 0x08, 0x00, 0x00, 0x00, // ICMP: 类型(Echo请求)、代码、校验和 0x00, 0x01, 0x00, 0x01, // ICMP: 标识符、序列号 } ticker := time.NewTicker(5 * time.Second) defer ticker.Stop() for { select { case <-ticker.C: _, err := nic.Write(icmpPacket) if err != nil { log.Printf("发送数据包时出错: %v", err) } else { log.Println("已发送测试数据包") } } } }() // 等待中断信号 <-sigCh fmt.Println("\n收到中断信号,程序退出") }