请原谅我的iPhone/Objective-C新手状态!
我使用NSNetServiceBrowser找到了我的HTTP服务器,但现在我只需要找到服务的IP地址和端口。
在我的委托方法中,我得到了类似如下的东西:
NSNetService* server = [serverBrowser.servers objectAtIndex:0];
NSString *name = nil;
NSData *address = nil;
struct sockaddr_in *socketAddress = nil;
NSString *ipString = nil;
int port;
uint i;
for (i = 0; i < [[server addresses] count]; i++)
{
name = [server name];
address = [[server addresses] objectAtIndex:i];
socketAddress = (struct sockaddr_in *)
[address bytes];
ipString = [NSString stringWithFormat: @"%s",
inet_ntoa (socketAddress->sin_addr)];
port = socketAddress->sin_port;
NSLog(@"Server found is %s %d",ipString,port);
}
但是,即使调用了委托,也不会进入for循环。有什么想法吗?谢谢!
发布于 2009-06-02 08:48:23
您在回调中返回的NSNetService尚未准备好使用。您必须调用以下方法来获取它的地址:
- (void)resolveWithTimeout:(NSTimeInterval)timeout;
实现NSNetService委托方法以找出它何时解析:
- (void)netServiceDidResolveAddress:(NSNetService *)sender;
在这一点上,服务中应该至少有一个地址。
此外,请注意仔细阅读文档和头文件!这里的问题有些复杂,我已经忽略了。
发布于 2016-09-20 00:02:52
在一个类别中混合接受的答案:
NSNetService+Util.h
#import <Foundation/Foundation.h>
@interface NSNetService (Util)
- (NSArray*) addressesAndPorts;
@end
@interface AddressAndPort : NSObject
@property (nonatomic, assign) int port;
@property (nonatomic, strong) NSString *address;
@end
NSNetService+Util.m
#import "NSNetService+Util.h"
#include <arpa/inet.h>
@implementation NSNetService (Util)
- (NSArray*) addressesAndPorts {
// this came from http://stackoverflow.com/a/4976808/8047
NSMutableArray *retVal = [NSMutableArray array];
char addressBuffer[INET6_ADDRSTRLEN];
for (NSData *data in self.addresses)
{
memset(addressBuffer, 0, INET6_ADDRSTRLEN);
typedef union {
struct sockaddr sa;
struct sockaddr_in ipv4;
struct sockaddr_in6 ipv6;
} ip_socket_address;
ip_socket_address *socketAddress = (ip_socket_address *)[data bytes];
if (socketAddress && (socketAddress->sa.sa_family == AF_INET || socketAddress->sa.sa_family == AF_INET6))
{
const char *addressStr = inet_ntop(
socketAddress->sa.sa_family,
(socketAddress->sa.sa_family == AF_INET ? (void *)&(socketAddress->ipv4.sin_addr) : (void *)&(socketAddress->ipv6.sin6_addr)),
addressBuffer,
sizeof(addressBuffer));
int port = ntohs(socketAddress->sa.sa_family == AF_INET ? socketAddress->ipv4.sin_port : socketAddress->ipv6.sin6_port);
if (addressStr && port)
{
AddressAndPort *aAndP = [[AddressAndPort alloc] init];
aAndP.address = [NSString stringWithCString:addressStr encoding:kCFStringEncodingUTF8];
aAndP.port = port;
[retVal addObject:aAndP];
}
}
}
return retVal;
}
@end
@implementation AddressAndPort
@end
是的,我不怕创建大量的NSObject
实例……
https://stackoverflow.com/questions/938521
复制相似问题