我刚刚开始学习设计iphone应用程序,我正在尝试设置客户端服务器环境。作为首发,我想首先确保我发布的服务对客户端可见。我在Apple的Docs帮助下编写了服务器和客户端代码。但是我发现虽然我的服务已经发布(netServiceWillPublish(NSNetService *)发送者被调用),但我的客户端并没有识别这项服务。在客户端,调用委托函数netServiceBrowserWillSearch:(NSNetServiceBrowser *)浏览器让我相信客户端正在搜索服务。但是从不调用didFindService委托函数。我很难过为什么这不起作用。我已经从各个地方跟踪了客户端的示例代码,我的代码与他们的代码匹配。非常感谢对此的一些帮助
此外,我还有以下问题
服务名称(与传输级协议一起提供)是否可以是任何字符串?或者是否必须在http://www.dns-sd.org/ServiceTypes.html中指定。除了服务发现之外,这还解决了什么目的。
当我在服务器端打印出NSNetService对象的详细信息时(在设置套接字并启动服务之后),主机名将打印为(null)并且不显示任何地址。从技术上讲,当一个服务打开时,不应将它们设置为值吗?如果是,有人可以告诉我我的代码在哪里出错了吗?
我已经附加了项目的客户端和服务器代码块,其中完成了服务的发布和浏览。非常感谢帮助,因为我遇到了这个问题。
这是客户端浏览服务的代码片段
NSNetServiceBrowser *serviceBrowser;
serviceBrowser = [[NSNetServiceBrowser alloc] init];
[serviceBrowser setDelegate:self];
[serviceBrowser searchForServicesOfType:@"_http._tcp." inDomain:@"local."];
这是发布服务的服务器端的代码片段
BOOL success;
int fd;
int err;
int junk;
struct sockaddr_in addr;
NSInteger port;
port = 0;
fd = socket(AF_INET, SOCK_STREAM, 0);
success = (fd != -1);
if(success) {
memset(&addr, 0, sizeof(addr));
addr.sin_len = sizeof(addr);
addr.sin_family = AF_INET;
addr.sin_port = 0;
addr.sin_addr.s_addr = INADDR_ANY;
err = bind(fd, (const struct sockaddr*) &addr, sizeof(addr));
success = (err == 0);
}
if (success) {
err = listen(fd, 5);
success = (err == 0);
}
if (success) {
socklen_t addrLen;
addrLen = sizeof(addr);
err = getsockname(fd, (struct sockaddr *) &addr, &addrLen);
success = (err == 0);
if (success) {
assert( addrLen = sizeof(addr));
port = ntohs(addr.sin_port);
}
}
if (success) {
CFSocketContext context = { 0, (__bridge void *) self, NULL, NULL, NULL };
assert(self->_listeningSocket == NULL);
self->_listeningSocket = CFSocketCreateWithNative(NULL, fd, kCFSocketAcceptCallBack, AcceptCallBack, &context);
success = (self->_listeningSocket != NULL);
if (success) {
CFRunLoopSourceRef rls;
fd = -1; //listeningSocket is now responsible for closing the socket
rls = CFSocketCreateRunLoopSource(NULL, self.listeningSocket, 0);
assert(rls != NULL);
CFRunLoopAddSource(CFRunLoopGetCurrent(), rls, kCFRunLoopDefaultMode);
CFRelease(rls);
}
}
if (success) {
self.netService = [[NSNetService alloc] initWithDomain:@"local." type:@"_http._tcp." name:@"test" port:port];
success = (self.netService != nil);
}
if (success) {
self.netService.delegate = self;
[self.netService publishWithOptions:NSNetServiceNoAutoRename];
}
if (success) {
assert(port != 0);
[self serverDidStartOnPort:port];
}
else {
[self stopServer:@"Start Failed"];
if (fd != -1) {
junk = close(fd);
assert(junk == 0);
}
}
这是代码片段,告诉该服务已发布并打印出我的NSSocket对象的详细信息
- (void)netServiceWillPublish:(NSNetService *)sender {
NSLog(@"This function is getting called");
NSLog(@"sender.name %@",sender.name);
NSLog(@"sender.addresses %@",sender.addresses);
NSLog(@"sender.domain %@",sender.domain);
NSLog(@"sender.hostname %@",sender.hostName);
NSLog(@"sender.type %@",sender.type);
NSLog(@"sender.port %d",sender.port);
}
感谢
的Vivek