5 // Created by Alexander Strange on Tue Feb 11 2003.
6 // Copyright (c) 2003 __MyCompanyName__. All rights reserved.
9 #import "ITInetSocket.h"
10 #import <sys/socket.h>
13 @interface ITInetSocket(Debugging)
14 -(NSString*)dumpv6Addrinfo:(struct addrinfo *)_ai;
17 @implementation ITInetSocket
18 -(id)initWithFD:(int)fd delegate:(id)d
20 if (self = [super init])
22 state = ITInetSocketListening;
24 delegate = [d retain];
32 -(id)initWithDelegate:(id)d
34 if (self = [super init])
36 state = ITInetSocketDisconnected;
38 delegate = [d retain];
46 -(void) connectToHost:(NSString*)host onPort:(short)thePort
48 if (state == ITInetSocketDisconnected)
50 struct addrinfo hints;
52 const char *portNam = [[[NSNumber numberWithShort:thePort] stringValue] cString], *hostCStr = [host cString];
55 hints.ai_family = PF_INET6;
56 hints.ai_socktype = SOCK_STREAM;
57 hints.ai_protocol = IPPROTO_TCP;
58 hints.ai_canonname = NULL;
62 err = getaddrinfo(hostCStr,portNam,&hints,&ai);
63 if (err == EAI_NODATA) //it's a dotted-decimal IPv4 string, so we use v6compat stuff now
65 err = getaddrinfo([[NSString stringWithFormat:@"ffff::%s",hostCStr] cString],portNam,&hints,&ai);
67 NSLog([self dumpv6Addrinfo:ai]);
71 -(ITInetSocketState)state
77 @implementation ITInetSocket(Debugging)
78 -(NSString*)dumpv6Addrinfo:(struct addrinfo *)_ai
93 "\tAddr = {%#lx,%#lx,%#lx,%#lx}\n"
97 NSString *nsfmt = [NSString stringWithCString:cfmt];
98 NSMutableString *buf = [[[NSMutableString alloc] init] autorelease];
102 struct sockaddr_in6 *sa = (struct sockaddr_in6 *)_ai->ai_addr;
103 [buf appendFormat:nsfmt,_ai->ai_flags,_ai->ai_family,_ai->ai_socktype,_ai->ai_protocol,_ai->ai_canonname?_ai->ai_canonname:"",sa->sin6_len,sa->sin6_family,sa->sin6_port,sa->sin6_flowinfo,sa->sin6_addr.__u6_addr.__u6_addr32[0],sa->sin6_addr.__u6_addr.__u6_addr32[1],sa->sin6_addr.__u6_addr.__u6_addr32[2],sa->sin6_addr.__u6_addr.__u6_addr32[3],sa->sin6_scope_id];
105 while (_ai = _ai->ai_next);
106 [buf appendString:@"nil\n}"];