diff --git a/Source/NetworkCallbackController.mm b/Source/NetworkCallbackController.mm index bbe5cbd..2b9f067 100644 --- a/Source/NetworkCallbackController.mm +++ b/Source/NetworkCallbackController.mm @@ -34,6 +34,7 @@ NetworkCallbackController::NetworkCallbackController(NetworkConnection* connecti void NetworkCallbackController::OpenConnection(NSUInteger port) { + int yes = YES; // Pass ourselves to the callback so we don't have to use ugly globals. CFSocketContext context = { 0 }; context.info = this; @@ -55,22 +56,34 @@ void NetworkCallbackController::OpenConnection(NSUInteger port) do { listeningSocket_ = - CFSocketCreateWithSocketSignature(kCFAllocatorDefault, - &signature, // Socket signature. - kCFSocketAcceptCallBack, // Callback types. - &NetworkCallbackController::SocketAcceptCallback, // Callout function pointer. - &context); // Context to pass to callout. + 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. + int result = setsockopt(CFSocketGetNative(listeningSocket_), SOL_SOCKET, SO_REUSEADDR, &yes, sizeof(yes)); + result = setsockopt(CFSocketGetNative(listeningSocket_), SOL_SOCKET, SO_REUSEPORT, &yes, sizeof(yes)); + + 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);