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上分配请求的地址的主要内容,如果未能解决你的问题,请参考以下文章

C#里使用UdpClient和线程来创建UDP网络通讯

C#里使用UdpClient和线程来创建UDP网络通讯

无法访问已处置的对象。对象名称:'System.Net.Sockets.UdpClient'

是否应该处置 UdpClient?

无法使用UdpClient捕获收到的数据报

UdpClient使用