【问题标题】:How to select the network interface to use in my Cocoa app如何选择要在我的 Cocoa 应用程序中使用的网络接口
【发布时间】:2013-01-13 11:31:48
【问题描述】:

我正在尝试在不同的网络上运行测试。我能够在两个 WiFi 连接之间切换,但我需要知道如何在连接了以太网电缆的 WiFi 上运行测试。

所以基本上,我需要运行 ping 测试来检查机器上的所有网络是否正常工作。连接以太网端口后,它始终在以太网上运行 ping。我想在不同的网络之间切换。我可以在没有连接以太网的 WiFi 连接上执行此操作。

【问题讨论】:

  • 没有足够的信息来回答您的问题。您是什么意思“在连接了以太网电缆的 WiFi 上运行测试”?怎么连接?既然你标记了这个“iphone”,那比你在 Mac 上更重要。你到底想测试什么?
  • 嗨乔希...我已经更新了我的问题并正确标记了它。请看看你能不能帮帮我。
  • 啊。我已更新标题以澄清并发布答案。

标签: objective-c macos cocoa


【解决方案1】:

您将不得不使用套接字(您可以在 Objective-C 中做到这一点,这不像使用 NSURL 加载资源那么简单)。我记得,如果您通过要使用的接口的 IP 地址绑定到套接字,则使用该套接字意味着您正在使用该网络连接。

【讨论】:

  • 好的,乔希。任何想法如何做到这一点。制作示例代码可以帮助我。
  • 您最好研究一下套接字的使用,尝试根据您的发现编写一些代码,如果您遇到特定问题,请将其与您的问题一起发布。要求社区为您编写它而不先尝试是要求太多了。
  • GCDAsyncSocket 的示例项目允许套接字绑定到特定接口。链接在我下面的答案中。
【解决方案2】:

您可以从系统偏好设置中的网络Set Service Order...

【讨论】:

  • 大概 OP 想知道如何以编程方式执行此操作,因为他在 StackOverflow 上发布了他的问题。
  • 是的。我想知道如何使用可可框架在目标 C 中做到这一点。
【解决方案3】:

您可能要考虑的另一个替代方法是使用系统配置框架。

您可以使用 "SCNetworkSetSetCurrent" 之类的功能(将网络集从仅启用 WiFi 的网络更改为仅启用以太网的网络集)。

另外,如果您不打算向公众或通过应用商店发布此应用,您可以执行终端/UNIX 命令行操作,例如 "sudo ifconfig" 以获取特定界面(例如“en0” ) 在测试之间向上或向下。

【讨论】:

    【解决方案4】:

    你可以试试GCDAsyncSocket。您将需要更改与套接字的连接。在所有示例的 HTTPServer.m 文件中,您会发现:

    // By default bind on all available interfaces, en1, wifi etc
    
    interface = @"192.168.2.1";
    
    // Use a default port of 0
    // This will allow the kernel to automatically pick an open port for us
    
    port = 40000;
    

    您可以将接口设置为 en0、en1 等或直接使用接口的 IP 地址,如上例所示。我希望我会有所帮助。

    【讨论】:

      【解决方案5】:

      你需要编写一个特权工具助手,然后实现一些这样的功能

      func setNetworkLocation(newLocation : String,reply: @escaping (String) -> Void){
          var retVal : Bool = false
          var response = ""
          var prefs : SCPreferences
          prefs = SCPreferencesCreate (nil, "Softech" as CFString, nil)!
          var sets : CFArray
          sets = SCNetworkSetCopyAll (prefs)!
          
          
          let count = CFArrayGetCount(sets)
          var newSet : SCNetworkSet? = nil
          var bFound : Bool = false
          for nIndex  in 0..<count {
           let mySet = CFArrayGetValueAtIndex (sets, nIndex)
           let key = Unmanaged<SCNetworkSet>.fromOpaque(mySet!)
           newSet = key.takeUnretainedValue()
           let name : String = SCNetworkSetGetName(newSet!)! as String
           if(name  == newLocation){
            bFound = true
            break
           }
           print("Name: \(name) cerco \(newLocation)")
          }
          if(bFound){
              print("Trovata netwok location da impostare Name: \(newLocation)")
              retVal = SCNetworkSetSetCurrent (newSet!)
              print ("SCNetworkSetSetCurrent = \(retVal) ");
              retVal = SCPreferencesCommitChanges (prefs);
              print ("SCPreferencesCommitChanges = \(retVal) ")
              response = "setNetworkLocation: SCPreferencesCommitChanges = [\(retVal)] " + newLocation
          }else{
              response = "setNetworkLocation: Not found network location named [" + newLocation + "]"
          }
          reply(response)
      }
      

      从应用程序客户端使用

      func setNetworkLocation(name: String){
          let xpcService = prepareXPC()?.remoteObjectProxyWithErrorHandler() { error -> Void in
              NSLog("XPC error: \(error)")
              } as? RemoteProcessProtocol
      
          xpcService?.setNetworkLocation(newLocation:name , reply: { [self]
              responseInfo in
              NSLog("\(name): FGLanSelectionHelper setNetworkLocation response => \(responseInfo)")
              
          })
      }
      

      @IBAction func btnSetNetworkLocation(_ sender: Any) { setNetworkLocation(名称:“MyOffice”) }

      【讨论】:

        猜你喜欢
        • 2011-02-13
        • 2016-10-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-08-09
        相关资源
        最近更新 更多