iPhone 在个人热点模式下不发送网络广播/组播

2024-03-30

根据最近的实证研究结果以及网络上的各种帖子,在启用了个人热点的 iPhone 上运行的应用程序似乎无法将广播和/或多播发送到个人热点的网络上。任何人都可以阐明这个问题的原因吗?

应用程序

我有一个用跨平台 C++ 代码构建的 IOS 应用程序,它将其存在广播和多播到其运行的网络上。当 iPhone 连接到 Wi-Fi 网络时,该应用程序可以完美运行。在这种情况下,网络上的其他设备接收广播/多播,并且一切正常。通过将运行 WireShark 的计算机连接到网络,可以轻松验证这一点 - 可以在数据包跟踪中看到广播/多播数据包。

不用说,该应用程序在连接到本地 Wi-Fi 的 iPhone 上运行良好。

问题

当我在启用了个人热点的 iPhone 上运行该应用程序时,不会将任何广播/多播发布到热点网络上。这可以使用 WireShark 进行验证,它在其跟踪中没有显示此类数据包。

使用个人热点作为能够处理广播和多播的网络路由器是否有任何限制?

当我使用浏览器在“WireSharking”设备上请求网页时,个人热点正确响应所有数据包,返回网页内容。

附属信息

我遇到过其他 Stack Overflow 帖子,它们报告了相同或类似的问题:

  1. 使用 iPhone 作为热点时 TCP 连接无法正常工作 https://stackoverflow.com/questions/23535242/tcp-connection-not-working-properly-when-using-iphone-as-hotspot
  2. 个人热点发送ssdp广播失败 https://stackoverflow.com/questions/26559327/fail-to-send-ssdp-broadcast-by-personal-hotspot

在 iPhone 上编写此类广播/多播应用程序的一个很好的教程是 Michael Tyson 的“Talkie的制作过程:多接口广播和组播 http://atastypixel.com/blog/the-making-of-talkie-multi-interface-broadcasting-and-multicast/”。可以说我的应用程序符合所有要求(例如,在适当的情况下设置套接字选项 SO_BROADCAST、SO_DONTROUTE 和 IP_MULTICAST_IF)。

对上述参考文献(1)的回复写道“难道是因为个人热点引入了网络地址转换?我过滤了 WireShark 跟踪,仅显示连接到热点 IP 的数据包,并且没有证据表明个人热点向 NAT 地址发送任何内容。

总之

谁能解释为什么运行个人热点的 iPhone 不广播/多播数据包,以及如何解决该问题?

提前谢谢了。


我的广播工作正常(在 iOS 10 上)

我发布了第二个答案,因为我找到了一种在 iOS 10 上以个人热点模式进行广播的方法。该解决方案有点复杂,但我是如何让它工作的:

  1. use getifaddrs(if)循环遍历所有接口(do {} while (if = if->ifa_next))
  2. 拒绝环回接口(if->ifa_flags & IFF_LOOPBACK)
  3. 仅过滤支持广播的接口(if->ifa_flags & IFF_BROADCAST)
  4. 创建一个套接字int sock = socket()
  5. 启用广播:int yes = 1; setsockopt(sock, SOL_SOCKET, SO_BROADCAST, &yes, sizeof yes)
  6. 连接到广播地址:connect(sock, if->ifa_dstaddr, if->ifa_dstaddr->sa_len)
  7. now use send()发送您的信息!

我已经确认,当 iPhone 连接到 WiFi 网络时以及处于个人热点模式时,此功能都有效。

完整示例代码

#include <ifaddrs.h>
#include <arpa/inet.h>
#include <net/if.h>

-(IBAction)sayHello:(id)sender {

    // fetch a linked list of all network interfaces
    struct ifaddrs *interfaces;
    if (getifaddrs(&interfaces) == -1) {
        NSLog(@"getifaddrs() failed: %s", strerror(errno));
        return;
    }

    // loop through the linked list
    for(struct ifaddrs *interface=interfaces; interface; interface=interface->ifa_next) {

        // ignore loopback interfaces
        if (interface->ifa_flags & IFF_LOOPBACK) continue;

        // ignore interfaces that don't have a broadcast address
        if (!(interface->ifa_flags & IFF_BROADCAST) || interface->ifa_dstaddr == NULL) continue;

        // check the type of the address (IPv4, IPv6)
        int protocol_family;
        struct sockaddr_in ipv4_addr = {0};
        struct sockaddr_in6 ipv6_addr = {0};
        struct sockaddr *addr;
        if (interface->ifa_dstaddr->sa_family == AF_INET) {
            if (interface->ifa_dstaddr->sa_len > sizeof ipv4_addr) {
                NSLog(@"Address too big");
                continue;
            }
            protocol_family = PF_INET;
            memcpy(&ipv4_addr, interface->ifa_dstaddr, interface->ifa_dstaddr->sa_len);
            ipv4_addr.sin_port = htons(16000);
            addr = (struct sockaddr *)&ipv4_addr;

            char text_addr[255] = {0};
            inet_ntop(AF_INET, &ipv4_addr.sin_addr, text_addr, sizeof text_addr);
            NSLog(@"Sending message to %s:%d", text_addr, ntohs(ipv4_addr.sin_port));
        }
        else if (interface->ifa_dstaddr->sa_family == AF_INET6) {
            if (interface->ifa_dstaddr->sa_len > sizeof ipv6_addr) {
                NSLog(@"Address too big");
                continue;
            }
            protocol_family = PF_INET6;
            memcpy(&ipv6_addr, interface->ifa_dstaddr, interface->ifa_dstaddr->sa_len);
            ipv6_addr.sin6_port = htons(16000);
            addr = (struct sockaddr *)&ipv6_addr;

            char text_addr[255] = {0};
            inet_ntop(AF_INET6, &ipv6_addr.sin6_addr, text_addr, sizeof text_addr);
            NSLog(@"Sending message to %s:%d", text_addr, ntohs(ipv6_addr.sin6_port));
        }
        else {
            NSLog(@"Unsupported protocol: %d", interface->ifa_dstaddr->sa_family);
            continue;
        }

        // create a socket
        int sock = socket(protocol_family, SOCK_DGRAM, IPPROTO_UDP);
        if (sock == -1) {
            NSLog(@"socket() failed: %s", strerror(errno));
            continue;
        }

        // configure the socket for broadcast mode
        int yes = 1;
        if (-1 == setsockopt(sock, SOL_SOCKET, SO_BROADCAST, &yes, sizeof yes)) {
            NSLog(@"setsockopt() failed: %s", strerror(errno));
        }

        // create some bytes to send
        NSString *message = @"Hello world!\n";
        NSData *data = [message dataUsingEncoding:NSUTF8StringEncoding];

        if (-1 == connect(sock, addr, addr->sa_len)) {
            NSLog(@"connect() failed: %s", strerror(errno));
        }

        // send the message
        ssize_t sent_bytes = send(sock, data.bytes, data.length, 0);
        if (sent_bytes == -1) {
            NSLog(@"send() failed: %s", strerror(errno));
        }
        else if (sent_bytes<data.length) {
            NSLog(@"send() sent only %d of %d bytes", (int)sent_bytes, (int)data.length);
        }

        // close the socket! important! there is only a finite number of file descriptors available!
        if (-1 == close(sock)) {
            NSLog(@"close() failed: %s", strerror(errno));
        }
    }

    freeifaddrs(interfaces);
}

此示例方法在端口 16000 上广播 UDP 消息。

对于调试,您可以使用该工具socat。只需在计算机上运行以下命令(应与手机位于同一网络):

socat UDP-RECV:16000 STDOUT
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

iPhone 在个人热点模式下不发送网络广播/组播 的相关文章

  • Swift 中的自定义输入视图

    我花了几个小时试图弄清楚如何创建 然后定制inputView上班 我有一个网格TextInputs 想想拼字板 按下时应该加载自定义inputView插入文本 我创建了一个 xib文件包含UI elements为定制inputView 我能
  • 使用 Selenium for C# 登录 Facebook

    我一直在使用 Selenium C 框架并尝试进行 facebook 登录 但没有任何运气 这是我到目前为止得到的 基于这篇文章 使用 Selenium 测试 Facebook Connect 应用程序 https stackoverflo
  • UIView 内的 UIButton 目标操作

    我有一个习惯UIView我创建了一个UIButton 在该视图中 我有以下代码 func setupViews menuControlButton addTarget self action toggleButton forControlE
  • 具有多重继承的类的 sizeof

    首先 我知道 sizeof 取决于机器和编译器的实现 我使用的是 Windows 8 1 x64 gcc 5 3 0 没有标志传递给编译器 我从大学讲座中得到了以下代码 include
  • 返回指向 std::vector 中的对象的 a

    我有一个关于返回对向量元素的引用的非常基本的问题 有一个向量vec存储类的实例Foo 我想访问这个向量中的一个元素 不想使用向量索引 我应该如何编码该方法getFoo here include
  • Azure 2012 年 10 月 SDK 损坏 UseDevelopmentStorage=true

    有人尝试过使用 usedevelopmentstorage true 连接字符串的 2012 年 10 月 Azure sdk 吗 CloudStorageAccount Parse UseDevelopmentStorage true 抛
  • 获取给定EntityType的导航属性

    我在用VS2010 EF4 0 需要如下功能 private string GetNaviProps Type entityType eg typeof Employee NorthwindEntities en new Northwind
  • 如何在ios上定义可达性超时

    我使用 Reachability 类来了解我是否有可用的互联网连接 问题是当wifi可用但不能上网时 NetworkStatus currentReachabilityStatus方法花费太多时间 my code Reachability
  • 如何附加到 xml

    我有这个xml
  • 在不使用 Thread.Sleep c# 的情况下延迟发送电子邮件

    我有一个 for 循环 它循环并每个循环发送一封电子邮件 现在我正在使用 thread sleep 但我希望用户仍然能够与程序交互 只需取消该循环即可 是否可以在不使用 thread sleep 的情况下做到这一点 您是否在 UI 线程上运
  • C# 的空条件委托调用线程安全吗? [复制]

    这个问题在这里已经有答案了 这就是我一直以来编写事件引发者的方式 例如属性更改 public event PropertyChangedEventHandler PropertyChanged private void RaisePrope
  • Qt mouseReleaseEvent() 未触发?

    我有一个显示图片的库 我们称之为 PictureGLWidget 其中 class PictureGLWidget public QGLWidget 所以 PictureGLWidget 扩展了 QGLWidget 在PictureGlWi
  • 为什么 std::ranges::filter_view 对象必须是非常量才能查询其元素?

    include
  • 滚动视图下的iOS swift 4 imageview:双击缩小

    我已经应用了图像视图来通过捏合来放大 缩小 那很容易 当在图像视图上应用双击时 无法检测到选择方法 我使用 Xcode 9 和 swift 4 您能告诉我滚动视图是否应该应用双击手势吗 var previewImage UIImage ni
  • 使用 twitterkit 将图像发布到 Twitter

    我正在尝试使用 Twitter 的新 TwitterKit 和自定义 UI 发布图像和推文 他们提供的唯一文档是如何用他们的观点来做这件事 所以我可以弄清楚如何在没有图像的情况下做到这一点 NSMutableDictionary messa
  • 如何将 Metro 应用部署到桌面?

    我正在尝试将我的 C 应用程序部署到我的 Windows 8 Metro 桌面 我可以在 bin 文件夹中看到部署的文件 但是当我尝试打开它们时 出现以下错误 该应用程序只能在 AppContainer 的上下文中运行 我检查了属性上下文菜
  • 在类中使用 std::chrono::high_resolution_clock 播种 std::mt19937 的正确方法是什么?

    首先 大家好 这是我在这里提出的第一个问题 所以我希望我没有搞砸 在写这篇文章之前我用谷歌搜索了很多 我对编码 C 很陌生 我正在自学 考虑到有人告诉我 只为任何随机引擎播种一次是一个很好的做法 我在这里可能是错的 什么是正确 最佳 更有效
  • 编译器可以报告未知属性的错误吗?即使有范围?

    在N3291 7 6 1 3 5 属性语法和语义 decl attr grammar 关于如何属性是用我读过的源代码写的 使用一个属性范围令牌是有条件支持的 实现定义的行为 and For an 属性标记本国际标准中未指定 该行为是实现定义
  • 具有多种类型的 C# 泛型类型推断

    我有以下通用方法 用于将一种类型的输入对象序列化为超类型 如下所示 public string SerialiseAs
  • iOS Swift 中断键盘事件

    我在拦截键盘事件时遇到问题 我已将我的 iOS 与 SteelSeries Free 游戏手柄控制器 连接 当连接到 iOS 时 它将被检测为蓝牙键盘 这是在我打开Notes时测试的 按下游戏手柄上的任何按钮都会写一个字母 我需要拦截此按钮

随机推荐

  • 为什么我们要把一个mysql表分成许多更小的表?

    这似乎是一种常见的做法divide the data of one table into many databases many tables为了提高性能 我可以理解many databases部分原因是更多的数据库提供了更多的CPU 更多
  • matplotlib 补丁集合中的 Zorder 规范?

    我正在尝试绘制一系列矩形和圆形 其中圆形位于前景中 根据以下帖子 我必须设置 zorder 参数 我添加到图表中的补丁在 alpha 1 时不是不透明的 为什么 https stackoverflow com questions 53906
  • 使用复选框从 jquery 自动完成中选择多个选项

    我正在与jquery 自动完成 https jqueryui com autocomplete 我正在尝试以下代码 Html
  • 尝试保存其他实体时 Doctrine 事件侦听器中的无限循环

    我希望每次新的时候Distance保存实体 从 Place A 到 Place B 反向距离 从 Place B 到 Place A 也被插入到数据库中 https stackoverflow com q 30569463 2516943
  • 给定一个数字,找到与原始数字具有完全相同的数字组的下一个更高的数字

    我刚刚搞砸了一次面试 并且在面试问题上几乎取得了零进展 给定一个数字 找到下一个具有完全相同的数字 一组数字作为原始数字 例如 给出 38276 返回 38627 我想首先找到小于个位的第一个数字 从右侧 的索引 然后我会旋转子集中的最后一
  • android parse.com 保存安装错误。找不到要更新的对象

    我在下面收到此错误 但不知道该怎么办 我什至不知道要在这里发布什么代码 因为我似乎找不到代码中导致此错误的位置 还有一件更重要的事情要提 这个错误不会发生在我的第一个测试设备 运行 Android 4 0 4 的 HTC难以置信 上 但我的
  • Spring 返回 HTTP 406 的 JSON (NOT_ACCEPTABLE)

    Spring允许定义 ExceptionHandlers代替 RestControllerAdvice 我已经定义了很多其他的ExceptionHandlers其中适用于 HTTP 400 404 405 但是 HTTP 406 NOT A
  • 读取所有注册表值的快速方法

    我正在编写一个实用程序 需要创建 HKCR 中所有注册表值的列表 我使用递归函数来执行此操作 var list new Dictionary
  • jQuery 不调用 php

    由于某种原因 jQuery 没有加载我的 php 文件 单击该按钮 页面就会刷新 我已经验证 jQuery 可以正常工作 并且单击功能也可以正常工作 一旦到达 post它似乎没有调用该文件并经历暂停并回显结果 该目录对于 php 文件是正确
  • 获取最小时差

    我最近在一次编码面试中被问到这个问题 我得到了一系列 HH MM 格式的时间 我需要找到以分钟为单位的最小时差 时间本质上是循环的 因此 23 55 和 00 12 应该相差 17 该函数还需要将 00 00 处理为与 24 00 相同的东
  • 将文件从 HDFS 复制到本地计算机

    我在尝试将文件从 HDFS 文件系统 下载 到本地系统时遇到问题 即使相反的操作没有问题 注意 文件存在于 HDFS 文件系统的指定路径上 这是一个代码片段 Configuration conf new Configuration conf
  • 如何在 Typescript 中使用 Cytoscape.js 的 UI 扩展?

    是否可以在 Typescript 中使用 Cytoscape UI 扩展 可以使用布局扩展 但是当我需要时https github com cytoscape cytoscape js cxtmenu https github com cy
  • 在散景 vbar 工具提示中显示高度

    我想制作一些简单数据的条形图 例如像这样的 pandas 数据框 Cats 4 Dogs 3 Mice 27 我想要一个工具提示 当鼠标悬停在栏上时显示如下内容 Name Cats Count 4 对于条形图 这适用于 hover tool
  • 在 Java 中通过引用传递数组

    在Java中可以将数组作为参数传递吗 int 5 result 我想传递对数组的引用 因为我想更改调用函数中的数组 语法是什么 private void demo int array new int 5 System out println
  • 无法部署firebase功能

    Node js 命令提示符只是忽略此函数 而其他函数正在部署 我也没有收到任何错误 var database admin database var postsRef database ref posts postsRef on child
  • PyInstaller - FileNotFoundError:没有这样的文件或目录:“”

    我看过很多关于这个完全相同的错误代码的帖子 但有许多不同的答案 但我仍然无法解决我的问题 我的帖子与所有其他帖子的不同之处在于我得到以下内容 317 INFO Building PKG because PKG 00 toc is non e
  • 使用 pyodbc 从 Python 应用程序将值插入 Access 2003 数据库

    我过去经常检查 stackoverflow 并且总是能够找到我一直在寻找的东西 但我似乎无法让这个工作 所以我问我的第一个问题 我并不是一个真正的程序员 但我在工作中提到过Python 现在我有一个Python项目 实际上 我已经把一切都弄
  • Spring Security 与 Struts 的集成

    我正在尝试在一个简单的应用程序中将 spring security 与 struts1 2 使用 LDAP 集成 我有 applicationContext security xml
  • ASP.NET MVC 5 和 Web API 2 .NET 要求

    我的主机提供商仅支持 NET 4 是否可以在 NET 4 计算机中运行 MVC 5 和 Web API 2 简短回答 不 您需要 NET 4 5 仅当添加依赖项时 剃须刀 v3 0 ASP NET 网页 v3 0
  • iPhone 在个人热点模式下不发送网络广播/组播

    根据最近的实证研究结果以及网络上的各种帖子 在启用了个人热点的 iPhone 上运行的应用程序似乎无法将广播和 或多播发送到个人热点的网络上 任何人都可以阐明这个问题的原因吗 应用程序 我有一个用跨平台 C 代码构建的 IOS 应用程序 它