java - iPhone 拒绝 UDP 数据包的一些可能原因是什么?

标签 java iphone networking sockets udp

在 iPhone 上,我正在运行一个带有 AsyncUdpSocket 库的应用程序来处理 UDP 网络。我已经测试过了。 我可以将 UDP 数据包从我的 iPhone 发送到运行正确接受 UDP 的 Java 程序的服务器。

然而,当它反过来时,Java 程序的 UDP 消息无法通过 iPhone。所以我决定测试该库是否可以发送/接收自己的 UDP 数据包或没有在 iPhone 上使用 127.0.0.1,结果是它有效。

所以我想知道是否正在发送 UDP 数据包,所以我使用 Wireshark 查看我的网络 Activity 。

alt text

直接链接到上图:http://img46.imageshack.us/img46/7939/screenshot20100220at110.png

在 iPhone 程序中,我指示我的 UDP 程序使用端口 55555 连接到 192.168.99.11,这是我的 MacBook。我的 Macbook 上的 Java UDP 程序被告知要连接的远程 ip 是 192.168.99.13 (我的 iPhone)在端口 55555 上。

在 Wireshark 上,我可以看到 ICMP 告诉我目标和端口无法从 iPhone 访问。

那么有人知道为什么 iPhone 会阻止 UDP 数据包吗?还是我忽略了什么?

最佳答案

除非我在理解您的问题时遗漏了什么,否则您有两个客户端样式的应用程序。两者都尝试连接到另一台主机上的端口 55555。我不知道它如何在单个盒子上为您工作。

让我描述一下正常的客户端-服务器(也就是主动/被动)场景:

  1. 服务器创建 UDP 套接字并将其bind(2) 到已知端口(在您的示例中为 55555),
  2. 服务器在套接字上调用recv(2)-family 函数来接受来自客户端的数据,
  3. 客户端创建 UDP 套接字并调用 sendto(2) 函数,目标地址参数用服务器的 IP 地址和已知端口号初始化。
  4. 服务器从 recv(2) 返回来自客户端的数据,
  5. 可选地,客户端和服务器交换更多消息。

关键是你需要在服务器端绑定(bind)已知端口。另一方面,服务器不需要知道客户端的地址和端口,因此服务器是被动的而客户端是主动的。我应该补充一点,UDP 应用程序同时充当客户端和服务器的情况并不少见。从逻辑上讲,这些是不同的角色。

顺便提一下,您收到“ICMP 端口无法访问”响应的原因可能有几个:

  • 没有进程绑定(bind)到服务器机器上的端口(参见上面的第 1 点),
  • 服务器机器上的防火墙主动拒绝发送到该端口的数据包。

希望这能稍微清除它。如果我严重误解了您的问题,请告诉我。

关于java - iPhone 拒绝 UDP 数据包的一些可能原因是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2302832/

相关文章:

java - zip4j:java.lang.NoClassDefFoundError

java - 使用 SQL 表中的值创建 JButton 面板;

iphone - 使iPhone状态栏在显示模态视图时消失?

sockets - 如何在 Rust 中发送源地址为 0.0.0.0 的 UDP 数据报?

Java 类路径,未找到类

java - 日期年份的 JPA 约束

iphone - bundle 标识符与先前的 bundle 标识符不同

iphone - 有没有办法从 .app 文件对 Xcode 项目进行逆向工程?

ruby-on-rails - Redis:奇怪的协议(protocol)/网络错误

Android 127.0.0.1(环回)连接 : Works on WiFi, 3G/4G 失败