#import "ITInetServerSocket.h"
#import "ITInetSocket.h"
#import <sys/types.h>
+#import <sys/time.h>
#import <arpa/inet.h>
#import <netinet/in.h>
#import <sys/socket.h>
#import <unistd.h>
/* 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;
-(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
service = nil;
port = 0;
rndType = rndName = nil;
+ timer = nil;
}
return self;
}
service = nil;
port = 0;
rndType = rndName = nil;
+ timer = nil;
}
return self;
}
+(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
listen(sockfd, SOMAXCONN);
fcntl(sockfd,F_SETFL,O_NONBLOCK);
[self setupRendezvousAdvertising];
+ [self setupTimer];
}
- (void)stopConnection
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];
+ (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)
{
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