X-Git-Url: http://git.ithinksw.org/ITFoundation.git/blobdiff_plain/5fadb328bb7952174fcb7a6bb867c9c11f801df9..3941e1bf85cdad02f5f7825d61cbbded49d035fe:/ITInetServerSocket.m diff --git a/ITInetServerSocket.m b/ITInetServerSocket.m index f4b9720..c37ec4f 100755 --- a/ITInetServerSocket.m +++ b/ITInetServerSocket.m @@ -9,6 +9,7 @@ #import "ITInetServerSocket.h" #import "ITInetSocket.h" #import +#import #import #import #import @@ -17,8 +18,7 @@ #import /* Too bad Objective-C doesn't have class variables... */ -static NSMutableDictionary *servsockets; -static NSTimer *timer; +static NSMutableSet *servsockets; @interface ITInetServerSocket(Private) +(void)registerSocket:(ITInetServerSocket*)sock; @@ -28,17 +28,17 @@ static NSTimer *timer; -(void)stopConnection; -(void)setupRendezvousAdvertising; -(void)stopRendezvousAdvertising; -+(void)setupTimer; -+(void)stopTimer; +-(void)setupTimer; +-(void)stopTimer; +(void)globalTimerFunc:(NSTimer*)timer; --(BOOL)timerFunc; +-(void)timerFunc:(NSTimer*)timer; @end @implementation ITInetServerSocket + (void)initialize { - servsockets = [[NSMutableDictionary alloc] init]; - [self setupTimer]; + servsockets = [[NSMutableSet alloc] init]; + //[self setupTimer]; } - (id)init @@ -51,6 +51,7 @@ static NSTimer *timer; service = nil; port = 0; rndType = rndName = nil; + timer = nil; } return self; } @@ -65,6 +66,7 @@ static NSTimer *timer; service = nil; port = 0; rndType = rndName = nil; + timer = nil; } return self; } @@ -78,7 +80,7 @@ static NSTimer *timer; [rndType release]; } -- (BOOL)registerSocket +- (BOOL)start { if (!rndName || !rndType || !port) return NO; [ITInetServerSocket registerSocket:self]; @@ -133,13 +135,13 @@ static NSTimer *timer; +(void)registerSocket:(ITInetServerSocket*)sock { [sock setupConnection]; - [servsockets setObject:sock forKey:[NSString stringWithFormat:@"%lu",[sock port]]]; + [servsockets addObject:sock]; } +(void)unregisterSocket:(ITInetServerSocket*)sock { [sock stopConnection]; - [servsockets removeObjectForKey:[NSString stringWithFormat:@"%lu",[sock port]]]; + [servsockets removeObject:sock]; } -(short)lookupPortForServiceType:(NSString*)name @@ -175,6 +177,7 @@ static NSTimer *timer; listen(sockfd, SOMAXCONN); fcntl(sockfd,F_SETFL,O_NONBLOCK); [self setupRendezvousAdvertising]; + [self setupTimer]; } - (void)stopConnection @@ -199,13 +202,13 @@ static NSTimer *timer; service = nil; } -+ (void)setupTimer +- (void)setupTimer { - if (!timer) timer = [NSTimer timerWithTimeInterval:0 target:self selector:@selector(globalTimerFunc:) userInfo:nil repeats:YES]; + if (!timer) timer = [NSTimer timerWithTimeInterval:0 target:self selector:@selector(timerFunc:) userInfo:nil repeats:YES]; [[NSRunLoop currentRunLoop] addTimer:timer forMode:NSDefaultRunLoopMode]; } -+ (void)stopTimer +- (void)stopTimer { [timer invalidate]; [timer release]; @@ -214,16 +217,10 @@ static NSTimer *timer; + (void)globalTimerFunc:(NSTimer*)timer { - NSEnumerator *enume = [servsockets objectEnumerator]; - id obj; - - while (obj = [enume nextObject]) - { - [obj timerFunc]; - } + [servsockets makeObjectsPerformSelector:@selector(timerFunc)]; } -- (BOOL)timerFunc +- (void)timerFunc:(NSTimer*)timer { if (sockfd != -1) { @@ -232,16 +229,14 @@ static NSTimer *timer; signed int cfd; cfd = accept(sockfd,(struct sockaddr*)&csa,&csalen); if (cfd == -1) { - if (errno == EWOULDBLOCK) return NO; + if (errno == EWOULDBLOCK) ; else {perror("Too bad I haven't implemented error checking yet");} } else { - ITInetSocket *csocket = [[[ITInetSocket alloc] initWithFD:cfd delegate:self] autorelease]; + ITInetSocket *csocket = [[ITInetSocket alloc] initWithFD:cfd delegate:self]; [clients addObject:csocket]; [delegate newClientJoined:csocket]; - return YES; } } - return NO; } @end \ No newline at end of file