Golang:当源端口与拨号响应不同时的 ReadFromUDP 行为

我在 golang 中编写了以下简单的 udp 服务器/客户端。应用程序将当前时间发送到指定的 ipv6 链接本地地址。接收者发回一点回复。这仅在回复的发送方端口与请求的目标端口相同时才有效。


Wireshark 对比:https ://www.dropbox.com/s/ypaepz62sa4xtnh/go_simple_udp3.png ? dl =0


为什么会这样?


package main


import (

"net"

"log"

"fmt"

"time"

)


func main() {


//Remote Addr

BoxAddr, err := net.ResolveUDPAddr("udp6", "[fe80:0000:0000:0000:0211:7d00:0030:8e3f]:5684")

if(err != nil) {

    log.Fatal(err)

    return

}


/*

LocalAddr, err := net.ResolveUDPAddr("udp6", "[fe80::299f:4146:2e32:72fd%4]:50361")

if(err != nil) {

    log.Fatal(err)

    return

}

*/

c, err := net.DialUDP("udp6", nil, BoxAddr)

if(err != nil) {

    log.Fatal(err)

    return

}


defer c.Close()


fmt.Print(c.LocalAddr())


//read loop

go func(c *net.UDPConn) {


    for {

        rxMsg := make([]byte, 100);

        n,_, err := c.ReadFromUDP(rxMsg)

        if(err != nil) {

            log.Fatal(err)

            return

        } else {

            fmt.Print("Got from remote: ",n, " bytes\r\n")

        }

    }

}(c)


//write every second current time

for {

    b := []byte(time.Now().String())

    n, err := c.Write(b)


    if(err != nil) {

        log.Fatal(err)

        return

    } else {

        fmt.Print("Wrote to destination socket: ",n, " bytes\r\n")

    }


    time.Sleep(1000 * time.Millisecond)

}

}



一只甜甜圈
浏览 314回答 2
2回答

忽然笑

当您使用 时DialUDP,您正在创建一个“已连接”的 UDP 套接字,它只侦听来自给定远程地址的数据报。底层系统调用connect与手册页中说明的相同:如果套接字 sockfd 是 SOCK_DGRAM 类型,则 addr 是默认发送数据报的地址,也是接收数据报的唯一地址。如果要侦听在特定 UDP 端口上接收到的任何数据报,请使用ListenUDP.

慕桂英546537

好吧,我想通了。首先,我必须为没有说我使用 Windows(10) 而道歉!这种行为来自 Windows 防火墙。当它关闭时,我可以在回复中接收具有不同 SOURCE 端口的数据包。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go