通过热点网络的GCDWebServer

时间:2019-06-05 16:40:16

标签: ios networking hotspot gcdwebserver

我正在开发一个应用程序,设备可以通过公用wi-fi网络相互连接并进行交互,并且出于文件交换的目的,我正在使用GCDWebServer

当我使用常规的wi-fi网络或设备通过第三方主机连接到热点网络时,一切工作都很好。但是,当启动应用程序的设备之一实际上是一个热点主机时,我会遇到一个奇怪的问题。

我有此代码:

- (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,该功能应该告诉地址,而当热点网络实际上为en0时,此功能仅在bridge100界面中查找地址。

问题是-是否有使“ GCDWebServer”与bridge100一起使用的“正常”方法?

第二部分:

尽管serverURL为nil,但是方法startWithPort返回true。因此,我认为服务器可能正在运行,只是无法告诉我其地址。因此,我使用自定义方法获得了设备的地址(如果您有兴趣,我可以在此处附加它,但我100%确信它提供了正确的地址),并尝试使用它来与Web服务器“对话”,但运气不好-服务器没有响应。所以也许startWithPort毕竟会返回错误的结果。

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

任何帮助将不胜感激!

2 个答案:

答案 0 :(得分:1)

  

问题是-是否有使GCDWebServer与bridge100一起使用的“正常”方法?

不。您需要派生GCDWebServer并修补此功能。

  

尽管serverURL为nil,方法startWithPort返回true。

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

答案 1 :(得分:0)

为了总结:

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

接下来要做的是

自行定义设备的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;
}