Golang编写的UDP-Client无法接收到来自服务器的消息

我写了一个Java Client,它向广播地址发送消息。


我还编写了一个 Java Server,它接受所有发送的消息并将消息发送回客户端。


现在我想尝试在 Go 中做完全相同的事情,只是为了获得一些经验。服务器工作正常,正在接收消息并响应 Java 客户端。


但是我的 Go Client 只向 Go/Java 服务器发送消息,但没有收到任何消息。根据wireshark的说法,消息被发送回正确的IP和端口,但显然该端口无法访问。


我的代码如下:转到服务器:


package main


import (

    "fmt"

    "log"

    "net"

)


func main() {

    //Resolving address

    udpAddr, err := net.ResolveUDPAddr("udp4", "0.0.0.0:8888")


    if err != nil {

        log.Println("Error: ", err)

    }


    // Build listining connections

    conn, err := net.ListenUDP("udp", udpAddr)


    defer conn.Close()


    if err != nil {

        log.Println("Error: ", err)

    }


    // Interacting with one client at a time

    for {

        fmt.Println(">>>Ready to receive broadcast packets!")


        // Receiving a message

        recvBuff := make([]byte, 15000)

        _, rmAddr, err := conn.ReadFromUDP(recvBuff)


        if err != nil {

            panic(err)

        }


        fmt.Println(">>>Discovery packet received from: " + rmAddr.String())

        fmt.Println(">>>Packet received; data: " + string(recvBuff))


        // Sending the same message back to current client

        conn.WriteToUDP(recvBuff, rmAddr)


        fmt.Println(">>>Sent packet to: " + rmAddr.String())

} }


一只萌萌小番薯
浏览 187回答 2
2回答

郎朗坤

即使您只打算从连接发送 UDP 数据包,您通常也希望ListenUDP使用ReadFromUDP和WriteToUDP方法来创建连接。当您使用 时DialUDP,它会创建一个“连接的”UDP 套接字,带有一个隐式远程端点,它将过滤传入的数据包。从 Linuxconnect手册页:如果套接字 sockfd 是 SOCK_DGRAM 类型,则 addr 是默认发送数据报的地址,也是接收数据报的唯一地址。

largeQ

如果您不忽略从 WriteToUDP 返回的错误,它实际上会给您一个错误:“sendto: message to long”在 OSX 上,最大 UDP 数据报大小默认设置为 9216 字节。您尝试发送 15000 个字节。如果你只是想写回你收到的东西,那么写recvBuff[:n],其中 n 是之前接收的字节数。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go