// // ALSocketPort.m // Aluminum Framework // // Created by Philippe Hausler on 8/8/08. // Copyright 2008. All rights reserved. // #import "TCPSocket.h" @implementation TCPSocket - (id)initWithTCPPort:(unsigned short)port { self = [super init]; if ( (fd = socket( AF_INET, SOCK_STREAM, 0 )) < 0 ) { return NULL; } int on = 1; setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, &on, sizeof(on)); bzero( &serverAddress, sizeof(serverAddress) ); serverAddress.sin_family = AF_INET; serverAddress.sin_port = htons(port); serverAddress.sin_addr.s_addr = htonl( INADDR_ANY ); if ( bind( fd, (struct sockaddr *)&serverAddress, sizeof(serverAddress) ) < 0 ) { return NULL; } if ( listen( fd, 5 ) < 0 ) { return NULL; } return self; } - (id)initWithConnectionTo:(NSString *)host onTCPPort:(unsigned short)port { self = [super init]; fd = socket(PF_INET, SOCK_STREAM, 0); if(fd == -1) { return NULL; } struct sockaddr_in stSockAddr; bzero(&stSockAddr, sizeof(stSockAddr)); stSockAddr.sin_family = AF_INET; stSockAddr.sin_port = htons(port); struct hostent *host_entry = gethostbyname([host UTF8String]); char * ip = inet_ntoa (*(struct in_addr *)*host_entry->h_addr_list); int err = inet_pton(AF_INET, ip, (void *) &stSockAddr.sin_addr); if(err <= 0) { return NULL; } if(connect(fd,(struct sockaddr*) &stSockAddr, sizeof(stSockAddr)) == -1) { return NULL; } return self; } - (NSData *)address { return [NSData dataWithBytes:(void *)&serverAddress length:sizeof(struct sockaddr_in)]; } - (NSSocketNativeHandle)socket { return fd; } @end