最近写一段简单的 UDP 代码,结果在死活不能正常运行。根本原因尚未查明,但找到了规避方案,拟此文章记之。
简化后的代码如下。这段代码初始化两个地址,然后本地监听,最后发送到指定的远程。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
|
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 上运行上述代码,会报告以下错误:
1
2
3
4
5
6
7
8
|
$ 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 上就可以运行了。
等哪天找到真实原因了再来更新。