acceptConnectionInBackgroundAndNotify
Accepts a socket connection (for stream-type sockets only) in the background and creates a file handle for the “near” (client) end of the communications channel.
- (void)acceptConnectionInBackgroundAndNotify
Discussion of [NSFileHandle acceptConnectionInBackgroundAndNotify]
This method asynchronously creates a file handle for the other end of the socket connection and returns that object by posting a
NSFileHandleConnectionAcceptedNotification
notification in the current thread. The notification includes a userInfo dictionary with the created NSFileHandle
object, which is accessible using theNSFileHandleNotificationFileHandleItem
key.
You must call this method from a thread that has an active run loop.
Special Considerations of [NSFileHandle acceptConnectionInBackgroundAndNotify]
The receiver must be created by an
initWithFileDescriptor:
message that takes as an argument a stream-type socket created by the appropriate system routine, and that is being listened on. In other words, you must bind()
the socket, and ensure that the socket has a connection backlog defined by listen()
.
The object that will write data to the returned file handle must add itself as an observer of
NSFileHandleConnectionAcceptedNotification
.
Note that this method does not continue to listen for connection requests after it posts
NSFileHandleConnectionAcceptedNotification
. If you want to keep getting notified, you need to call acceptConnectionInBackgroundAndNotify
again in your observer method.
Example of [NSFileHandle acceptConnectionInBackgroundAndNotify]
-(void)createSocket
{
// create socket and wait for events to come in
NSSocketPort* serverSock = [[NSSocketPort alloc] initWithTCPPort: 1234];
socketHandle = [[NSFileHandle alloc] initWithFileDescriptor: [serverSock socket]
closeOnDealloc: NO];
[[NSNotificationCenter defaultCenter] addObserver: self selector: @selector(newConnection:)
name: NSFileHandleConnectionAcceptedNotification
object: socketHandle];
[socketHandle acceptConnectionInBackgroundAndNotify];
}
- (void)newConnection:(NSNotification*)notification
{
NSLog(@"connection accepted");
NSDictionary* userInfo = [notification userInfo];
NSFileHandle* remoteFileHandle = [userInfo objectForKey:
NSFileHandleNotificationFileHandleItem];
if([[userInfo allKeys] containsObject:@"NSFileHandleError"]){
NSNumber* errorNo = [userInfo objectForKey:@"NSFileHandleError"];
if( errorNo ) {
NSLog(@"NSFileHandle Error: %@", errorNo);
return;
}
}
[socketHandle acceptConnectionInBackgroundAndNotify];
[[NSNotificationCenter defaultCenter] addObserver:self
selector: @selector(processSocketData:)
name: NSFileHandleReadCompletionNotification
object: remoteFileHandle];
// Send a message to the client, acknowledging that the connection was accepted
[remoteFileHandle writeData: [@"OK" dataUsingEncoding: NSASCIIStringEncoding]];
[remoteFileHandle readInBackgroundAndNotify];
}