MacOS 上 Golang UDP 程序的一个问题记录
最近写一段简单的 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 上就可以运行了。
等哪天找到真实原因了再来更新。