首页 > 解决方案 > Go net.DialUDP 自动选择环回接口

问题描述

我需要从主机上的 eth0 向自身发送一些 UDP 数据包,也在 eth0 上。

我有一些可用的 Go 代码,但它似乎使用的是环回接口而不是 eth0 预期的那样。

package main

import (
    "net"
)

func main() {
    ip := net.ParseIP("192.168.1.158")

    src := net.UDPAddr{IP: ip, Port: 8888,}
    dest := net.UDPAddr{IP: ip, Port: 88}

    conn, _ := net.DialUDP("udp", &src, &dest)

    conn.Write([]byte("hi"))
}

192.168.1.158 是我机器上接口的主要和唯一 IP 地址。

运行以下命令会显示流量:

sudo tcpdump udp -v -i lo

但是,我希望流量来自/来自具有我定义的 IP 地址的系统接口。

我在这里错过了一步吗?

我也尝试过这种略有不同的方法,但结果相同:

src, _ := net.ResolveUDPAddr("udp", "192.168.1.158:8888")
dest, _ := net.ResolveUDPAddr("udp", "192.168.1.158:88")

标签: goudp

解决方案


但是,我希望流量来自/来自具有我定义的 IP 地址的系统接口。

这只是错误的期望,与 Go 无关。

只需尝试ping 192.168.1.158检查tcpdump -i lo -n icmp数据tcpdump -i eth0 -n icmp实际传输的位置即可。您将看到数据包在lo接口上传输。类似的 aip route get 192.168.1.158将向您显示到您的本地地址的路由通过该lo接口。


推荐阅读