首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >基于热点网络的GCDWebServer

基于热点网络的GCDWebServer
EN

Stack Overflow用户
提问于 2019-06-05 16:40:16
回答 2查看 3.6K关注 0票数 2

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

当我使用通常的with网络或设备与第三方主机连接到热点网络时,一切都很好。但我遇到了一个奇怪的问题,当其中一个设备与推出的应用程序实际上是一个热点主机。

我有这样的代码:

代码语言:javascript
复制
- (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是零,但是startWithPort方法返回true。所以我想服务器可能在运行,只是不能告诉我它的地址。所以我用我的自定义方法获得了设备的地址(如果您感兴趣,我可以在这里附加它,但我100%肯定它给出了正确的地址),并试图使用它来与web服务器“交谈”,但没有运气的那个服务器没有响应。因此,也许startWithPort最终会返回一个错误的结果。

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

任何帮助都将不胜感激!

EN

回答 2

Stack Overflow用户

发布于 2019-06-06 01:34:05

因此,问题是--是否有一种“正常”的方式让GCDWebServer与bridge100协同工作?

不是的。您需要分叉GCDWebServer并修补这个函数。

虽然serverURL是零,但是startWithPort方法返回true。

如果此方法返回true,服务器肯定正在运行。端口是打开和侦听的(默认情况下绑定到所有接口)。问题是您需要找出从iPhone外部到达服务器所使用的IP。

票数 2
EN

Stack Overflow用户

发布于 2019-06-06 09:11:11

为了总结一下:

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

接下来你需要做的是:

自行定义设备的IP地址。下面是一种可以使用的方法:

代码语言:javascript
复制
    - (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

代码语言:javascript
复制
- (NSString *)serverURL {
    NSString *serverURL = [NSString stringWithFormat:@"http:/%@:%d", [self getDeviceAddress], serverPort]; //serverPort is the port your GCDWebServer is running on
    return serverURL;
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56464724

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档