我正在开发一个应用程序,设备可以通过公用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
显示了正确的地址,并且由于我可以访问设备文件夹,因此它肯定正在运行。
任何帮助将不胜感激!
答案 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;
}