GCDWebServer via Hotspot network



我正在开发一个应用程序,其中设备可以通过通用的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);
}
});
}

问题是服务器URLnil。这实际上似乎是合乎逻辑的,因为我检查了一个应该告诉地址的函数GCDWebServerGetPrimaryIPAddress,而当热点网络实际bridge100时,该函数仅在en0接口中查找地址。

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

第二部分:

尽管serverURL为 nil,但方法startWithPort返回true。所以我想也许服务器正在运行,它只是无法告诉我它的地址。所以我用我的自定义方法获得了设备的地址(如果你有兴趣,我可以把它附在这里,但我 100% 确定它给出了一个正确的地址)并尝试使用它来"说话"与 Web 服务器,但没有运气 - 服务器没有响应。所以也许startWithPort毕竟会返回一个错误的结果。

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

任何帮助将不胜感激!

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

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

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

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

为了总结:

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;
}

相关内容

  • 没有找到相关文章

最新更新