2

我正在开发一个应用程序,其中设备可以通过通用 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应该告诉地址的函数,而这个函数只是en0在 Hotspot 网络实际上是在接口中查找地址bridge100

所以问题是 - 是否有一种“正常”的方式可以让 GCDWebServer 工作bridge100

第二部分:

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

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

任何帮助,将不胜感激!

4

2 回答 2

2

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

不,您需要分叉 GCDWebServer 并修补此功能。

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

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

于 2019-06-06T01:34:05.717 回答
0

为了总结:

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-06-06T09:11:11.893 回答