Objective c GameKit/互联网上的点对点

Objective c GameKit/互联网上的点对点,objective-c,ios,p2p,gamekit,Objective C,Ios,P2p,Gamekit,对于我正在开发的iOS应用程序,我希望多部手机能够相互连接,并能够在这些设备之间进行语音聊天 当两台设备都在同一个网络上时,我可以让它工作。这很简单,我想做的大部分事情都是可能的 但现在我添加了互联网支持,这是一个相当麻烦的问题。我将首先尝试使用我设置的一个小Web服务来解释如何匹配这些设备 服务器 使用会话模式GKSessionModelPeer启动新的GameKit会话 在我刚刚创建的会话上查找服务器的“对等ID” 在空闲端口上创建新的CFSocketRef,并使其准备好接受连接 将对等ID

对于我正在开发的iOS应用程序,我希望多部手机能够相互连接,并能够在这些设备之间进行语音聊天

当两台设备都在同一个网络上时,我可以让它工作。这很简单,我想做的大部分事情都是可能的

但现在我添加了互联网支持,这是一个相当麻烦的问题。我将首先尝试使用我设置的一个小Web服务来解释如何匹配这些设备

服务器

  • 使用会话模式GKSessionModelPeer启动新的GameKit会话
  • 在我刚刚创建的会话上查找服务器的“对等ID”
  • 在空闲端口上创建新的CFSocketRef,并使其准备好接受连接
  • 将对等ID和端口号发送到在外部服务器上运行的my webservice
  • WebService

  • Webservice接收信息并将其与客户机的ID和IP地址一起存储在数据库中
  • 将ID发送回显示ID的服务器
  • 客户端

  • 当用户选择使用GameKit的“在线”功能搜索游戏时,我会要求用户输入一个ID(用户应在其中输入服务器接收到的ID)
  • 客户端连接到提供ID的Web服务。Web服务返回有关服务器会话(IP、端口、对等ID)的信息
  • 用户尝试使用端口信息连接到IP地址,并与服务器建立输入和输出流
  • 这当然不起作用,因为我的网络不允许传入连接和随机端口(来自外部网络)

    但现在的问题是,我该如何解决这个问题?我希望能够在两台设备之间建立点对点连接,这些设备可以在同一网络上,但也可以在单独的网络上


    是否有一个框架、示例或任何说明如何做到这一点的内容?我希望能够将数据从一个设备发送到另一个设备,而无需先将数据发送到服务器。

    我不知道有任何框架可以做到这一点。不过,我在跨多个网络的p2p网络方面有很多经验

    我学到的一条重要规则是:在网络间通信时,除非必要,否则不要创建直接连接。有太多的因素会导致问题,比如防火墙、NAT等等

    当然,您可以让连接先尝试。您可以尝试连接到给定的IP地址*,但在大多数情况下会失败。即使使用UPnP和NAT-PMP,您也会发现在很多情况下(超过一半?),您根本无法接受传入连接

    所以一定要有备份计划。制作一个网络层抽象,不仅
    listen()
    ,而且还连接到服务器。这样,当您无法连接到客户端的IPs*时,您只需通过服务器建立一个连接,网络抽象就可以完成这一切

    让我重申以上几点:不要只依赖传入的连接,始终要有一个备份计划


    *我写IP是因为客户端可以有多个本地/远程IP。连接时始终迭代所有这些IP。示例:我的手机有两个本地IPv4地址(10.0.0.172和10.8.0.2)和一个IPv6地址([2001:x:x::6])。在这三个地址中,只有IPv6地址是可公开访问的,而这两个IPv4地址位于不同的子网上,因此您是否可以连接到它们取决于另一个客户端所在的子网。始终尝试连接到这两个服务器,并在服务器代理连接失败时返回到服务器代理连接


    **我提到IPv6,是的。别忘了IPv6不受NAT的限制,这与IPv4不同,这意味着如果支持IPv6,您通过IPv6获得良好连接的可能性远远高于IPv4。

    这正是我所担心的。Gamecenter似乎确实支持语音聊天,但由于P2P连接存在的问题,我猜他们使用的是某种SIP。