在iPhone上,我正在运行一个带有AsyncUdpSocket库的应用程序来处理UDP网络.我测试了它.我可以从我的iPhone发送UDP数据包到运行正确接受UDP的
Java程序的服务器.
但是,当它相反时,Java程序的UDP消息无法通过iPhone.所以我决定测试库是否可以在iPhone上使用127.0.0.1发送/接收自己的UDP数据包,结果是可行的.
所以我想知道是否正在发送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数据包吗?或者有什么我忽略的?
最佳答案 除非我在理解你的问题时遗漏了一些内容,否则你有两个客户端式的应用程序.两者都尝试连接到另一台主机上的端口55555.我不知道它如何在单个盒子上为你工作.
让我描述一下普通的客户端 – 服务器(a.k.a主动/被动)场景:
> server创建UDP套接字并将其绑定到已知端口(在您的示例中为55555),
>服务器调用recv(2)-family函数在套接字上接受来自客户端的数据,
>客户端创建UDP套接字并调用sendto(2)函数,其目标地址参数使用服务器的IP地址和已知端口号初始化.
>服务器从recv(2)返回来自客户端的数据,
>可选的客户端和服务器交换更多消息.
关键是您需要在服务器端绑定已知端口.另一方面,服务器不需要知道客户端的地址和端口,因此服务器是被动的并且客户端是活动的.我应该补充一点,UDP应用程序同时充当客户端和服务器并不罕见.从逻辑上讲,这些是不同的角色.
除此之外,可能有几个原因导致您获得“ICMP端口无法访问”响应:
>没有进程绑定到服务器计算机上的端口(参见上面的第1点),
>服务器计算机上的防火墙主动拒绝发送到该端口的数据包.
希望这有点清除它.如果我严重误解了你的要求,请告诉我.