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

时间:2010-02-20 16:31:27

标签: java iphone networking sockets udp

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

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

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

alt text http://img46.imageshack.us/img46/7939/screenshot20100220at110.png

直接链接到上面的图片: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数据包吗?或者有什么我忽略的?

1 个答案:

答案 0 :(得分:2)

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

让我描述正常的客户端 - 服务器(a.k.a主动/被动)场景:

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

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

除此之外,可能有几个原因导致您获得“ICMP端口无法访问”响应:

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

希望这有点清除它。如果我严重误解了你的要求,请告诉我。