• go语言在macOS运行,程序读不到255.255.255.255的广播包,但是我用wireshark可以收到。为什么?


    关注 码龄 粉丝数 原力等级 -- 被采纳 被点赞 采纳率 Miarcle_Jarvis 2024-06-05 14:13 采纳率: 0% 浏览 5 首页/ 编程语言 / go语言在macOS运行,程序读不到255.255.255.255的广播包,但是我用wireshark可以收到。为什么? golangmacosudp go语言在macOS运行,程序读不到255.255.255.255的广播包,但是我用wireshark可以收到。为什么? 收起 写回答 好问题 0 提建议 追加酬金 关注问题 微信扫一扫 点击复制链接 分享 邀请回答 编辑 收藏 删除 结题 收藏 举报 追加酬金 (90%的用户在追加酬金后获得了解决方案) 当前问题酬金 ¥ 0 (可追加 ¥500) ¥ 15¥ 20¥ 50¥ 100¥ 200 支付方式 扫码支付 二维码出错 点击刷新 支付金额 15 元 提供问题酬金的用户不参与问题酬金结算和分配 支付即为同意 《付费问题酬金结算规则》 结题 再想想 删除 再等等

    2条回答 默认 最新

    • 阿里嘎多学长 2024-06-05 14:14
      关注

      以下内容由CHATGPT及阿里嘎多学长共同生成、有用望采纳:


      从您提供的两个JPEG文件内容来看,我们可以分析出以下几点:

      Wireshark捕获数据分析(文件1):

      1. 通信记录:Wireshark显示了从源地址192.168.0.6到广播地址255.255.255.255的UDP通信。这些数据包的源端口是9123,目标端口也是9123。

      2. 数据包内容:数据包长度不一,从60到148字节不等。这可能表明不同的数据负载或消息类型。

      3. 时间戳:数据包在不同的时间点被发送,这可能与发送频率或触发条件有关。

      Go语言程序代码分析(文件2):

      1. 程序日志:日志显示程序成功解析了UDP地址192.168.0.43:9123,并开始监听。这表明程序配置为监听来自该地址的UDP数据包。

      2. 代码实现

        • net.ResolveUDPAddr:用于解析UDP地址,程序中使用该函数来获取服务器地址。
        • net.ListenUDP:用于监听指定网络和地址上的UDP数据包。程序中使用该函数来启动监听。
      3. 错误处理:代码中检查了err变量,以确保没有错误发生。

      问题分析:

      • 广播包接收问题:尽管Wireshark能够捕获到广播包,但您的Go程序可能没有正确配置来接收广播包。在macOS上,接收广播包可能需要额外的配置,因为默认情况下,广播包可能不会被接收。

      • 代码配置:您的Go程序配置为监听192.168.0.43:9123,而不是广播地址255.255.255.255:9123。这意味着程序只会接收来自192.168.0.43的UDP数据包,而不是所有广播到255.255.255.255的数据包。

      解决建议:

      1. 修改监听地址:将程序中的监听地址改为广播地址255.255.255.255:9123

      2. 检查网络配置:确保macOS的网络配置允许接收广播包。这可能涉及到修改系统设置或使用特定的网络接口。

      3. 错误处理:确保程序能够正确处理接收广播包时可能出现的错误,并在日志中记录这些信息。

      4. 测试:在修改配置后,使用Wireshark和Go程序同时监听同一网络,以验证程序是否能够接收到广播包。

      参考资料:

      请注意,由于我无法访问外部链接,上述参考资料地址仅供参考。您可以根据需要搜索相关信息。

      展开全部

      评论 编辑记录
    • 专家-赤兔[在线] 全栈领域优质创作者 2024-06-05 14:14
      关注

      引自免费微信小程序:皆我百晓生

      在 macOS 上,当 Go 程序尝试接收广播(即目的地址为 255.255.255.255)的数据报时,可能遇到一些限制。这是因为 macOS 的防火墙默认会阻止来自网络接口的广播流量,除非明确允许。这可能是你在 Go 代码中无法接收到广播数据报的原因,而 Wireshark 能够接收到是因为它可能被系统豁免了这些限制。

      要解决这个问题,你需要确保你的 Go 程序也有权限接收广播流量。这里有一个步骤可以帮助你检查并允许你的应用接收广播:

      1. 创建一个防火墙例外: 打开终端,然后输入以下命令创建一个名为 myGoApp 的防火墙例外,并允许 UDP 流量:

        sudo firewall-cmd --permanent --add-service=udp --service-name=myGoApp
        sudo firewall-cmd --reload
        

        这个命令将允许所有端口上的 UDP 流量通过防火墙。如果你的应用只在特定端口上监听,比如 9123,你可以替换上述命令中的 --service-name=myGoApp--port=9123/tcp--port=9123/udp,具体取决于你的应用使用的协议。

      2. 测试你的应用程序: 在创建防火墙例外后,重新运行你的 Go 应用,看看是否能正确接收到广播数据报。如果仍然无法接收到,那么问题可能不在防火墙设置上,而是你的代码逻辑。在这种情况下,请提供更详细的 Go 代码,以便我可以分析其中可能存在的问题。

      以下是简化版的 Go 代码示例,用于接收广播数据报:

      package main
      
      import (
      	"log"
      	"net"
      )
      
      func main() {
      	ip := "255.255.255.255" // 目标广播 IP 地址
      	port := 9123             // 监听端口
      
      	serverAddr, _ := net.ResolveUDPAddr("udp", ":"+port)
      	listener, _ := net.ListenUDP("udp", serverAddr)
      
      	for {
      		buffer := make([]byte, 1024)
      		n, addr, _ := listener.ReadFromUDP(buffer)
      		log.Printf("Received broadcast from %s: %s", addr.String(), buffer[:n])
      	}
      }
      

      将这段代码保存为 main.go 文件,然后在终端中执行 go run main.go 来运行这个程序。如果之前已经设置了正确的防火墙规则,你应该能看到接收到的广播消息。如果还是有问题,请确认你的网络环境没有其他限制,例如其他防火墙软件或路由器设置。

      展开全部

      评论 编辑记录
    编辑
    预览

    报告相同问题?

  • 相关阅读:
    docker
    openssl官网文档资料
    算力网络调研笔记
    聊聊 13 种锁的实现方式
    CentOS 7 编译安装 Git
    提升科研可复现性:和鲸聚焦 AI for Science 全生命周期管理
    苹果签名应用掉签频繁原因排查,以及如何避免
    Mysql零基础入门到实战——数据库基础+MySQL常见命令
    云原生架构(CloudNative)|文末送资料:马-云原生微服务治理大厂冲刺班56期
    k8s中的有状态,无状态,pv、pvc等
  • 原文地址:https://ask.csdn.net/questions/8114360