我正在编写一个程序来获取 udp 服务器。当我第一次获取服务器时它可以工作。
但是当我第二次输入程序时。这给了我这个错误
panic: Listen failed:dial udp :8829->:9781: bind: address already in use
代码:
package main
import (
"fmt"
"log"
"net"
"os"
)
func main() {
log.SetFlags(log.Lshortfile)
udpServer, err := net.ResolveUDPAddr("udp", ":9781")
if err != nil {
panic(fmt.Sprint("ResolveUDPAddr failed:", err.Error()))
os.Exit(1)
}
client, err := net.ResolveUDPAddr("udp", ":8829")
if err != nil {
panic(err)
}
for {
fmt.Printf(">> ")
var input string
fmt.Scanf("%s", &input)
conn, err := net.DialUDP("udp", client, udpServer)
if err != nil {
panic(fmt.Sprint("Listen failed:", err.Error()))
os.Exit(1)
}
_, err = conn.Write([]byte(input))
if err != nil {
panic(fmt.Sprint("Write data failed:", err.Error()))
os.Exit(1)
}
received := make([]byte, 1024)
_, err = conn.Read(received)
if err != nil {
panic(fmt.Sprint("Read data failed:", err.Error()))
os.Exit(1)
}
fmt.Printf("Response: %s\n", string(received))
}
}
我认为发生这种情况是因为我使用了客户端两次。
但是为什么这会导致“地址已在使用中”
我不会重新创建客户端。
我尝试过的解决方案
解决方案之一可以将 client 设置为 nil。
设置为 nil 将生成随机端口。
但就我而言,我需要固定端口和固定网络地址。
所以这不是解决方案。
只需在循环之前创建连接即可:
package main
import (
"fmt"
"log"
"net"
"os"
)
func main() {
log.SetFlags(log.Lshortfile)
udpServer, err := net.ResolveUDPAddr("udp", ":9781")
if err != nil {
panic(fmt.Sprint("ResolveUDPAddr failed:", err.Error()))
os.Exit(1)
}
client, err := net.ResolveUDPAddr("udp", ":8829")
if err != nil {
panic(err)
}
conn, err := net.DialUDP("udp", client, udpServer)
if err != nil {
panic(fmt.Sprint("Listen failed:", err.Error()))
os.Exit(1)
}
for {
fmt.Printf(">> ")
var input string
fmt.Scanf("%s", &input)
_, err = conn.Write([]byte(input))
if err != nil {
panic(fmt.Sprint("Write data failed:", err.Error()))
os.Exit(1)
}
received := make([]byte, 1024)
_, err = conn.Read(received)
if err != nil {
panic(fmt.Sprint("Read data failed:", err.Error()))
os.Exit(1)
}
fmt.Printf("Response: %s\n", string(received))
}
}