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

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

最近写一段简单的 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 上就可以运行了。

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

标签:macOS · Go · UDP