【问题标题】:GCDWebServer via Hotspot networkGCDWebServer 通过热点网络
【发布时间】:2019-10-21 05:08:20
【问题描述】:

我正在开发一个应用程序,设备可以通过普通的 wi-fi 网络相互连接和交互,并且为了文件交换我正在使用GCDWebServer

当我使用常用​​的 wi-fi 网络或设备通过 3rd 方主机连接到热点网络时,一切正常。但是当启动应用程序的设备之一实际上是热点主机时,我遇到了一个奇怪的问题。

我有这个代码:

- (void)startStreamHLSServer
{
    dispatch_async(dispatch_get_main_queue(), ^{
        if (!_webServer.isRunning)
        {
            _webServer = [GCDWebServer new];
            [_webServer addGETHandlerForBasePath:@"/" directoryPath:[_fileManager videosURL].path indexFilename:nil cacheAge:3600 allowRangeRequests:YES];

            [_webServer startWithPort:1000 bonjourName:nil];

            NSLog(@"URL: %@", _webServer.serverURL.absoluteString);
        }
    });
}

问题是 serverURL 是nil。这实际上看起来是合乎逻辑的,因为我检查了一个函数 GCDWebServerGetPrimaryIPAddress,它应该告诉地址,当热点网络实际上是 bridge100 时,这个函数只在 en0 接口中查找地址。

所以问题是 - 有没有一种“正常”的方法可以让 GCDWebServer 与 bridge100 一起工作?

第二部分:

虽然serverURL 为nil,但方法startWithPort 返回true。所以我想也许服务器正在运行,它只是不能告诉我它的地址。所以我用我的自定义方法得到了设备的地址(如果你有兴趣,我可以在这里附上它,但我 100% 确定它给出了正确的地址)并尝试使用它来与网络服务器“对话”,但没有运气 - 服务器没有响应。所以也许startWithPort毕竟返回了一个错误的结果。

非常有趣的观察 - 当我在 GCDWebServerGetPrimaryIPAddress 方法中将 primaryInterface 更改为 bridge100 时,它解决了这个问题。 GCDWebServer 显示了正确的地址,它肯定正在运行,因为我可以访问设备文件夹。

任何帮助将不胜感激!

【问题讨论】:

    标签: ios networking hotspot gcdwebserver


    【解决方案1】:

    所以问题是 - 有没有一种“正常”的方法可以让 GCDWebServer 与 bridge100 一起工作?

    没有。您需要 fork GCDWebServer 并修补此功能。

    虽然 serverURL 为 nil,但 startWithPort 方法返回 true。

    如果此方法返回 true,则服务器肯定正在运行。端口处于打开状态并正在侦听(默认情况下绑定到所有接口)。问题是您需要弄清楚使用什么 IP 从 iPhone 外部访问服务器。

    【讨论】:

    • 您好,感谢您的回复!确实你是对的,服务器正在运行!我之前没有成功连接它,因为我忘记在地址中添加'http:/'前缀。添加它后,服务器开始响应我。我认为这是一个问题。
    【解决方案2】:

    为了总结:

    GCDWebServer 可以在热点网络中使用,尽管serverURL 为 nil。

    接下来你需要做的是:

    自行定义设备的 IP 地址。您可以使用以下方法:

        - (void)getDeviceAddress
        {
            NSString *address = @"";
            struct ifaddrs *interfaces = NULL;
            struct ifaddrs *temp_addr = NULL;
            int success = 0;
    
            // retrieve the current interfaces - returns 0 on success
            success = getifaddrs(&interfaces);
    
            if (success == 0)
            {
                temp_addr = interfaces;
    
                while(temp_addr != NULL)
                {
                    if(temp_addr->ifa_addr->sa_family == AF_INET)
                    {
                        NSString *interfaceName = [NSString stringWithUTF8String:temp_addr->ifa_name];
                        if([interfaceName isEqualToString:@"bridge100"] || [interfaceName isEqualToString:@"en0"])
                        {
                            //fetch ip address
                            address = [NSString stringWithUTF8String:inet_ntoa(((struct sockaddr_in *)temp_addr->ifa_addr)->sin_addr)];
                            break;
                        }
                    }
    
                    temp_addr = temp_addr->ifa_next;
                }
            }
    
            freeifaddrs(interfaces);
            return address;
    }
    

    2) 记住您启动时使用的端口GCDWebServer

    3) 建立你的serverURL:

    - (NSString *)serverURL {
        NSString *serverURL = [NSString stringWithFormat:@"http:/%@:%d", [self getDeviceAddress], serverPort]; //serverPort is the port your GCDWebServer is running on
        return serverURL;
    }
    

    【讨论】:

      猜你喜欢
      • 2019-10-26
      • 1970-01-01
      • 2013-02-28
      • 2021-08-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-01-21
      • 2023-03-24
      相关资源
      最近更新 更多