diff --git a/Source/NetworkCallbackController.mm b/Source/NetworkCallbackController.mm index bbe5cbd..cd1ea15 100644 --- a/Source/NetworkCallbackController.mm +++ b/Source/NetworkCallbackController.mm @@ -34,6 +34,7 @@ NetworkCallbackController::NetworkCallbackController(NetworkConnection* connecti void NetworkCallbackController::OpenConnection(NSUInteger port) { + BOOL yes = YES; // Pass ourselves to the callback so we don't have to use ugly globals. CFSocketContext context = { 0 }; context.info = this; @@ -54,23 +55,44 @@ void NetworkCallbackController::OpenConnection(NSUInteger port) signature.address = (CFDataRef)[NSData dataWithBytes:&address length:sizeof(address)]; do { + /* listeningSocket_ = CFSocketCreateWithSocketSignature(kCFAllocatorDefault, &signature, // Socket signature. kCFSocketAcceptCallBack, // Callback types. - &NetworkCallbackController::SocketAcceptCallback, // Callout function pointer. + , // Callout function pointer. &context); // Context to pass to callout. + + */ + listeningSocket_ = + CFSocketCreate( + kCFAllocatorDefault, + signature.protocolFamily, signature.socketType, signature.protocol, + kCFSocketAcceptCallBack, &NetworkCallbackController::SocketAcceptCallback, + &context); + if (NULL != listeningSocket_) { + if (! CFSocketIsValid(listeningSocket_)) { + CFRelease(listeningSocket_); + listeningSocket_ = NULL; + } else { + // Allow old, yet-to-be recycled sockets to be reused. + setsockopt(CFSocketGetNative(listeningSocket_), SOL_SOCKET, SO_REUSEADDR, &yes, sizeof(BOOL)); + setsockopt(CFSocketGetNative(listeningSocket_), SOL_SOCKET, SO_REUSEPORT, &yes, sizeof(BOOL)); + + if (kCFSocketSuccess != CFSocketSetAddress(listeningSocket_, signature.address)) { + CFSocketInvalidate(listeningSocket_); + CFRelease(listeningSocket_); + listeningSocket_ = NULL; + } + } + } + if (!listeningSocket_) { [connection_ errorEncountered:@"Could not open socket."]; sleep(1); } } while (!listeningSocket_); - // Allow old, yet-to-be recycled sockets to be reused. - BOOL yes = YES; - setsockopt(CFSocketGetNative(listeningSocket_), SOL_SOCKET, SO_REUSEADDR, &yes, sizeof(BOOL)); - setsockopt(CFSocketGetNative(listeningSocket_), SOL_SOCKET, SO_REUSEPORT, &yes, sizeof(BOOL)); - // Schedule the socket on the run loop. CFRunLoopSourceRef source = CFSocketCreateRunLoopSource(kCFAllocatorDefault, listeningSocket_, 0); CFRunLoopAddSource(runLoop_, source, kCFRunLoopCommonModes);