X-Git-Url: http://git.ithinksw.org/ITFoundation.git/blobdiff_plain/d7b4e9008bca3278755f8b96c0ea9d5e3c94c39d..ff8c7276aef4c1113c7692dc1935db8977623b3a:/ITInetServerSocket.m?ds=inline diff --git a/ITInetServerSocket.m b/ITInetServerSocket.m index 8f75326..f7ff228 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; } @@ -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]; [clients addObject:csocket]; [delegate newClientJoined:csocket]; - return YES; } } - return NO; } @end \ No newline at end of file