我使用以下代码在使用Bonjour连接到主机时查找服务器主机名(使用<netinet/in.h>
中的函数
和我的iOS Objective-C代码中的<arpa/inet.h>
)。我正在使用的代码(如下所示)来自Big Nerd Ranch iOS编程书,但最初并未考虑ARC。
- (NSString *)serverHostName
{
NSArray *addresses = [desktopServer addresses];
NSData *firstAddress = [addresses objectAtIndex:0];
// the binary data in the NSData object is a sockaddr_in (which represents a network host)
const struct sockaddr_in *addy = [firstAddress bytes];
// convert 4-byte IP address in network byte order to a C string of the format xxx.xxx.xxx.xxx
char *ipAddress = inet_ntoa(addy->sin_addr);
// convert the 2-byte port number from network to host byte order
UInt16 port = ntohs(addy->sin_port);
return [NSString stringWithFormat:@"%s:%u", ipAddress, port];
}
它偶尔会在char *ipAddress = inet_ntoa(addy->sin_addr);
行上的EXC_BAD_ACCESS崩溃,这让我相信addy
过早被处理掉了。我尝试过使用CFBridgingRetain()
或CFRetain()
方法来防止这种情况,但它们要么没有任何区别,要么似乎会引入更多问题。
关于我应该寻找什么来解决这个问题的任何建议?