sa_family field of your sockaddr struct, and handle IPv6 if you encounter it.#import "sys/socket.h" #import "netinet/in.h" #import "netinet6/in6.h" #import "arpa/inet.h" @interface NSString (NSStringNetworkingAdditions) + (NSString *)stringWithAddressData:(NSData *)aAddressData; @end @implementation NSString (NSStringNetworkingAdditions) + (NSString *)stringWithAddressData:(NSData *)aAddressData { struct sockaddr *socketAddress=(struct sockaddr *)[aAddressData bytes]; // IPv6 Addresses are "FFFF:FFFF:FFFF:FFFF:FFFF:FFFF:FFFF:FFFF" // at max, which is 40 bytes (0-terminated) // IPv4 Addresses are "255.255.255.255" at max which is smaller char stringBuffer[40]; NSString *addressAsString=nil; if (socketAddress->sa_family == AF_INET) { if (inet_ntop(AF_INET, &((struct in_addr)((struct sockaddr_in *)socketAddress)->sin_addr), stringBuffer,40)) { addressAsString=[NSString stringWithUTF8String:stringBuffer]; } else { addressAsString=@"IPv4 un-ntopable"; } int port = ((struct sockaddr_in *)socketAddress)->sin_port; addressAsString=[addressAsString stringByAppendingFormat:@":%d",port]; } else if (socketAddress->sa_family == AF_INET6) { if (inet_ntop(AF_INET6, &(((struct sockaddr_in6 *)socketAddress)->sin6_addr), stringBuffer,40)) { addressAsString=[NSString stringWithUTF8String:stringBuffer]; } else { addressAsString=@"IPv6 un-ntopable"; } int port = ((struct sockaddr_in6 *)socketAddress)->sin6_port; // Suggested IPv6 format (see http://www.faqs.org/rfcs/rfc2732.html) addressAsString=[NSString stringWithFormat:@"[%@]:%d",addressAsString,port]; } else { addressAsString=@"neither IPv6 nor IPv4"; } return [[addressAsString copy] autorelease]; } @endP.S.: I already released this code more implicitly some while ago with my Rendezvous samplecode RendezCon - but as category it's much cleaner.
Yeah, good old sierra game times brought back to you in your browser. Some sick people have done a game called Peasant's Quest
And if you get stuck like i did: a walkthrough for you
"What a happy coincidence. God hates the same people I do."
[via steve dekorte]