bind:无法在本地网络中的UDPclient上分配请求的地址
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了bind:无法在本地网络中的UDPclient上分配请求的地址相关的知识,希望对你有一定的参考价值。
因为我找到了一些如何编写go服务器和客户端的例子,这在一台机器上本地工作。
现在,我正在尝试在两台PC之间的本地网络中进行通信,一台运行go服务器脚本,一台运行客户端。
但是,由于错误,我无法建立连接:
错误:listen udp 192.168.11.6:10001:bind:无法分配请求的地址 恐慌:运行时错误:无效的内存地址或无指针取消引用[信号0xb代码= 0x1 addr = 0x0 pc = 0x401376] // ...
当然我会发布我的代码(客户端,问题发生的地方):
package main
import (
"fmt"
"net"
"strconv"
"time"
)
func CheckError(err error) {
if err != nil {
fmt.Println("Error: ", err)
}
}
func main() {
ServerAddr, err := net.ResolveUDPAddr("udp", "192.168.11.6:10001")
CheckError(err)
Conn, err := net.ListenUDP("udp", ServerAddr)
CheckError(err)
defer Conn.Close()
i := 0
for {
msg := strconv.Itoa(i)
i++
buf := []byte(msg)
_, err = Conn.WriteToUDP(buf, ServerAddr)
time.Sleep(time.Second * 1)
}
}
服务器:
package main
import (
"fmt"
"net"
"os"
)
/* A Simple function to verify error */
func CheckError(err error) {
if err != nil {
fmt.Println("Error: " , err)
os.Exit(0)
}
}
func main() {
ServerAddr,err := net.ResolveUDPAddr("udp",":10001")
CheckError(err)
ServerConn, err := net.ListenUDP("udp", ServerAddr)
CheckError(err)
defer ServerConn.Close()
buf := make([]byte, 1024)
for {
fmt.Println("Starting...")
n,addr,err := ServerConn.ReadFromUDP(buf)
fmt.Println("Received ",string(buf[0:n]), " from ",addr)
ServerConn.WriteToUDP([]byte("hello there!"), addr)
if err != nil {
fmt.Println("Error: ",err)
}
}
}
客户端具有本地网络IP地址192.168.11.8和服务器192.168.11.6。他们也可以互相ping通,当Windows要求时我打开端口。
我对所有的建议感到高兴。我很挣扎,因为我只找到localhost服务器客户端的例子。
好的,我明白了。奇怪的是,我必须允许应用程序在公共网络上进行通信?当我在我的家庭网络上时。 When starting the server - I had to enable public networks
我发现我不必在客户端打开套接字,而是使用DialUDP
服务器也需要完整的IP地址
ServerAddr,err := net.ResolveUDPAddr("udp","192.168.11.6:10001")
改进的客户端代码:(主要功能)
ServerAddr, err := net.ResolveUDPAddr("udp", "192.168.11.6:10001")
CheckError(err)
buf := make([]byte, 1024)
Conn, err := net.DialUDP("udp", nil, ServerAddr)
CheckError(err)
defer Conn.Close()
i := 0
for {
msg := strconv.Itoa(i)
i++
fmt.Printf(msg)
n, err := Conn.Write([]byte(msg))
CheckError(err)
fmt.Printf("sent %d bytes", n)
n, addr, err := Conn.ReadFromUDP(buf)
if err == nil {
fmt.Printf("%s %s
", buf, addr)
} else {
fmt.Printf("some err %v
", err)
}
time.Sleep(time.Second * 1)
}
以上是关于bind:无法在本地网络中的UDPclient上分配请求的地址的主要内容,如果未能解决你的问题,请参考以下文章