void OnReadStreamEvent(CFReadStreamRef stream, CFStreamEventType eventType);
void OnWriteStreamEvent(CFWriteStreamRef stream, CFStreamEventType eventType);
+ // Closes down the listening socket but keeps the streams alive. This can be
+ // called multiple times, even if the socket is NULL.
+ void CloseSocket();
+
// Removes the read or write stream from the run loop, closes the stream,
// releases the reference.
void UnscheduleReadStream();
void ReportError(CFErrorRef error);
// The actual socket.
- CFSocketRef socket_; // Strong.
+ CFSocketRef listeningSocket_; // Strong.
// The read and write streams that are scheduled on the |runLoop_|. Both are
// weak and are owned by the run loop source.
signature.address = (CFDataRef)[NSData dataWithBytes:&address length:sizeof(address)];
do {
- socket_ = CFSocketCreateWithSocketSignature(kCFAllocatorDefault,
- &signature, // Socket signature.
- kCFSocketAcceptCallBack, // Callback types.
- &NetworkCallbackController::SocketAcceptCallback, // Callout function pointer.
- &context); // Context to pass to callout.
- if (!socket_) {
+ listeningSocket_ =
+ CFSocketCreateWithSocketSignature(kCFAllocatorDefault,
+ &signature, // Socket signature.
+ kCFSocketAcceptCallBack, // Callback types.
+ &NetworkCallbackController::SocketAcceptCallback, // Callout function pointer.
+ &context); // Context to pass to callout.
+ if (!listeningSocket_) {
[connection_ errorEncountered:@"Could not open socket."];
sleep(1);
}
- } while (!socket_);
+ } while (!listeningSocket_);
// Allow old, yet-to-be recycled sockets to be reused.
BOOL yes = YES;
- setsockopt(CFSocketGetNative(socket_), SOL_SOCKET, SO_REUSEADDR, &yes, sizeof(BOOL));
- setsockopt(CFSocketGetNative(socket_), SOL_SOCKET, SO_REUSEPORT, &yes, sizeof(BOOL));
+ 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, socket_, 0);
+ CFRunLoopSourceRef source = CFSocketCreateRunLoopSource(kCFAllocatorDefault, listeningSocket_, 0);
CFRunLoopAddSource(runLoop_, source, kCFRunLoopCommonModes);
CFRelease(source);
}
void NetworkCallbackController::CloseConnection()
{
- if (socket_) {
- CFSocketInvalidate(socket_);
- CFRelease(socket_);
- socket_ = NULL;
- }
+ CloseSocket();
UnscheduleReadStream();
UnscheduleWriteStream();
}
ReportError(CFWriteStreamCopyError(writeStream_));
return;
}
-
+
[connection_ socketDidAccept];
+
+ CloseSocket();
}
void NetworkCallbackController::OnReadStreamEvent(CFReadStreamRef stream,
}
}
+void NetworkCallbackController::CloseSocket()
+{
+ if (listeningSocket_) {
+ CFSocketInvalidate(listeningSocket_);
+ CFRelease(listeningSocket_);
+ listeningSocket_ = NULL;
+ }
+}
+
void NetworkCallbackController::UnscheduleReadStream()
{
if (!readStream_)