我正在开发一个应用程序,设备可以通过公共with网络相互连接和交互,并且为了文件交换的目的,我正在使用GCDWebServer。
当我使用通常的with网络或设备与第三方主机连接到热点网络时,一切都很好。但我遇到了一个奇怪的问题,当其中一个设备与推出的应用程序实际上是一个热点主机。
我有这样的代码:
- (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显示了正确的地址,而且它肯定在运行,因为我可以访问设备文件夹。
任何帮助都将不胜感激!
发布于 2019-06-06 01:34:05
因此,问题是--是否有一种“正常”的方式让GCDWebServer与bridge100协同工作?
不是的。您需要分叉GCDWebServer并修补这个函数。
虽然serverURL是零,但是startWithPort方法返回true。
如果此方法返回true,服务器肯定正在运行。端口是打开和侦听的(默认情况下绑定到所有接口)。问题是您需要找出从iPhone外部到达服务器所使用的IP。
发布于 2019-06-06 09:11:11
为了总结一下:
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;
}https://stackoverflow.com/questions/56464724
复制相似问题