首页 文章

bind:无法在本地网络中的UDPclient上分配请求的地址

提问于
浏览
1

因为我找到了一些如何编写go服务器和客户端的例子,这在一台机器上本地工作 .

现在,我正在尝试在两台PC之间的本地网络中进行通信,一台运行go服务器脚本,一台运行客户端 .

但是,由于错误,我无法 Build 连接:

错误:listen udp 192.168.11.6:10001:bind:无法分配请求的地址panic:运行时错误:无效的内存地址或nil指针取消引用[signal 0xb code = 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服务器客户端的例子 .

1 回答

  • 1

    好的,我明白了 . 奇怪的是,我必须允许应用程序在公共网络上进行通信?当我在我的家庭网络上时 . 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\n", buf, addr)
        } else {
            fmt.Printf("some err %v\n", err)
        }
        time.Sleep(time.Second * 1)
    }
    

相关问题