Rename socket_ to listeningSocket_ and add CloseSocket() to help shut it down
authorRobert Sesek <rsesek@bluestatic.org>
Mon, 30 May 2011 00:53:47 +0000 (20:53 -0400)
committerRobert Sesek <rsesek@bluestatic.org>
Mon, 30 May 2011 00:53:47 +0000 (20:53 -0400)
Source/NetworkCallbackController.h
Source/NetworkCallbackController.mm

index 6f149c6c80fb33e9799a80305a0221b61ef568dd..64a141ce809b580804d09971d6082667ce5dce2c 100644 (file)
@@ -65,6 +65,10 @@ class NetworkCallbackController
   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();
@@ -74,7 +78,7 @@ class NetworkCallbackController
   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.
index 16ab54ff1d21db84418b79fd03f76663fc9effc6..537daccd447ae7bf340ece1cba3b56e592ef02bc 100644 (file)
@@ -52,35 +52,32 @@ void NetworkCallbackController::OpenConnection(NSUInteger port)
   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();
 }
@@ -198,8 +195,10 @@ void NetworkCallbackController::OnSocketAccept(CFSocketRef socket,
     ReportError(CFWriteStreamCopyError(writeStream_));
     return;
   }
-  
+
   [connection_ socketDidAccept];
+
+  CloseSocket();
 }
 
 void NetworkCallbackController::OnReadStreamEvent(CFReadStreamRef stream,
@@ -245,6 +244,15 @@ void NetworkCallbackController::OnWriteStreamEvent(CFWriteStreamRef stream,
   }
 }
 
+void NetworkCallbackController::CloseSocket()
+{
+  if (listeningSocket_) {
+    CFSocketInvalidate(listeningSocket_);
+    CFRelease(listeningSocket_);
+    listeningSocket_ = NULL;
+  }  
+}
+
 void NetworkCallbackController::UnscheduleReadStream()
 {
   if (!readStream_)