MacOS 上 Golang UDP 程序的一个问题记录

陪她去流浪 桃子 2020年11月16日 阅读次数:2504

最近写一段简单的 UDP 代码,结果在死活不能正常运行。根本原因尚未查明,但找到了规避方案,拟此文章记之。

简化后的代码如下。这段代码初始化两个地址,然后本地监听,最后发送到指定的远程。

package main

import (
	"fmt"
	"net"
)

func main() {
	localAddr, err := net.ResolveUDPAddr(`udp`, `127.0.0.1:6181`)
	if err != nil {
		panic(err)
	}
	remoteAddr, err := net.ResolveUDPAddr(`udp`, `example.com:6181`)
	if err != nil {
		panic(err)
	}

	conn, err := net.ListenUDP(`udp`, localAddr)
	if err != nil {
		panic(err)
	}
	defer conn.Close()
	fmt.Printf("Local: <%s> \n", conn.LocalAddr().String())

	_, err = conn.WriteToUDP([]byte("world"), remoteAddr)
	if err != nil {
		panic(err)
	}
}

在 MacOS 上运行上述代码,会报告以下错误:

$ go run main.go
Local: <127.0.0.1:6181>
panic: write udp 127.0.0.1:6181->93.184.216.34:6181: sendto: cannot assign requested address

goroutine 1 [running]:
main.main()
        ~/main.go:27 +0x293
exit status 2

在网上搜索了很久,几乎没找到答案。有人说是 MacOS 的问题,结果我在我的树莓派 Linux 上面尝试运行,真的能运行。 然而并没有找到 MacOS 不能运行上述代码的真实原因。

而后又瞎搜索折腾了一个小时之久,仍然没有答案。 然后我做了一个修改

把本地地址从 127.0.0.1 改成 0.0.0.0

在 MacOS 上就可以运行了。

等哪天找到真实原因了再来更新。

这篇文章的内容已被作者标记为“过时”/“需要更新”/“不具参考意义”。

标签:macOS · Go · UDP