Data gets truncated when sending over NSStream
Ok so I have been at this bug all day, and I think I've got it narrowed down to the fundamental problem. 

Background:
=============
I am working on an app that has required me to write my own versions of `NSNetService` and `NSNetServiceBrowser` to allow for Bonjour over Bluetooth in iOS 5. It has been a great adventure, as I knew nothing of network programming before I started this project. I have learned a lot from various example projects and from the classic [Unix Network Programming](http://www.amazon.com/dp/0131411551/ref=asc_df_01314115512091290?smid=ATVPDKIKX0DER&tag=hyprod-20&linkCode=asn&creative=395093&creativeASIN=0131411551&hvpos=1o1&hvexid=&hvnetw=g&hvrand=863296840689643157&hvpone=&hvptwo=&hvqmt=) textbook. My implementation is based largely on Apple's `DNSSDObjects` sample project. I have added code to actually make the connection between devices once a service has been resolved. An `NSInputStream` and an `NSOutputStream` are attained with `CFStreamCreatePairWithSocketToHost( ... )`.

Problem:
=============
I am trying to send some data over this connection. The data consists of an integer, a few `NSStrings` and an `NSData` object archived with `NSKeyedArchiver`. The size of the `NSData` is around 150kb so the size of the whole message is around 160kb. After sending the data over the connection I am getting the following exception when I try to unarchive...

    Terminating app due to uncaught exception 'NSInvalidArgumentException', 
    reason: '*** -[NSKeyedUnarchiver initForReadingWithData:]: incomprehensible archive 
    
After further exploration I have noticed that the received data is only about 2kb.. The message is being truncated, thus rendering the archive "incomprehensible."

Potentially relevant code:
=============
The method that sends the data to all connected devices

    - (void) sendMessageToPeers:(MyMessage *)msg
    {
      NSEnumerator *e = [self.peers objectEnumerator];
      
      //MyMessage conforms to NSCoding, messageAsData getter calls encodeWithCoder:
      NSData *data = msg.messageAsData; 
      
      Peer *peer;
      while (peer = [e nextObject]) {
        if (![peer sendData:data]) {
          NSLog(@"Could not send data to peer..");
        }
      }
    }
    
The method in the Peer class that actually writes data to the `NSOutputStream`

    - (BOOL) sendData:(NSData *)data
    {
      if (self.outputStream.hasSpaceAvailable) {
        [self.outputStream write:data.bytes maxLength:data.length];
        return YES;
      }
      else {
        NSLog(@"PEER DIDN'T HAVE SPACE!!!");
        return NO;
      }
    }
    
    
NSStreamDelegate method for handling stream events ("receiving" the data)

The buffer size in this code is 32768 b/c that's what was in whatever example code I learned from.. Is it arbitrary? I tried changing it to 200000, thinking that the problem was just that the buffer was too small, but it didn't change anything.. I don't think I fully understand what's happening. 

    - (void)stream:(NSStream *)aStream handleEvent:(NSStreamEvent)eventCode
    {
      switch (eventCode) {
        
        case NSStreamEventHasBytesAvailable: {
          NSInteger       bytesRead;
          uint8_t         buffer[32768];      // is this the issue?
    //    uint8_t         buffer[200000];   //this didn't change anything
          
          bytesRead = [self.inputStream read:buffer maxLength:sizeof(buffer)];
          if (bytesRead == -1) ...;
          else if (bytesRead == 0) ...;
          else {
            NSData	*data = [NSData dataWithBytes:buffer length:bytesRead];
            [self didReceiveData:data];
          }
        } break;
        
        /*omitted code for other events*/
      }
    }

Data gets truncated when sending over NSStream
===

Ok so I have been at this bug all day, and I think I've got it narrowed down to the fundamental problem. 

Background:
=============
I am working on an app that has required me to write my own versions of `NSNetService` and `NSNetServiceBrowser` to allow for Bonjour over Bluetooth in iOS 5. It has been a great adventure, as I knew nothing of network programming before I started this project. I have learned a lot from various example projects and from the classic [Unix Network Programming](http://www.amazon.com/dp/0131411551/ref=asc_df_01314115512091290?smid=ATVPDKIKX0DER&tag=hyprod-20&linkCode=asn&creative=395093&creativeASIN=0131411551&hvpos=1o1&hvexid=&hvnetw=g&hvrand=863296840689643157&hvpone=&hvptwo=&hvqmt=) textbook. My implementation is based largely on Apple's `DNSSDObjects` sample project. I have added code to actually make the connection between devices once a service has been resolved. An `NSInputStream` and an `NSOutputStream` are attained with `CFStreamCreatePairWithSocketToHost( ... )`.

Problem:
=============
I am trying to send some data over this connection. The data consists of an integer, a few `NSStrings` and an `NSData` object archived with `NSKeyedArchiver`. The size of the `NSData` is around 150kb so the size of the whole message is around 160kb. After sending the data over the connection I am getting the following exception when I try to unarchive...

    Terminating app due to uncaught exception 'NSInvalidArgumentException', 
    reason: '*** -[NSKeyedUnarchiver initForReadingWithData:]: incomprehensible archive 
    
After further exploration I have noticed that the received data is only about 2kb.. The message is being truncated, thus rendering the archive "incomprehensible."

Potentially relevant code:
=============
The method that sends the data to all connected devices

    - (void) sendMessageToPeers:(MyMessage *)msg
    {
      NSEnumerator *e = [self.peers objectEnumerator];
      
      //MyMessage conforms to NSCoding, messageAsData getter calls encodeWithCoder:
      NSData *data = msg.messageAsData; 
      
      Peer *peer;
      while (peer = [e nextObject]) {
        if (![peer sendData:data]) {
          NSLog(@"Could not send data to peer..");
        }
      }
    }
    
The method in the Peer class that actually writes data to the `NSOutputStream`

    - (BOOL) sendData:(NSData *)data
    {
      if (self.outputStream.hasSpaceAvailable) {
        [self.outputStream write:data.bytes maxLength:data.length];
        return YES;
      }
      else {
        NSLog(@"PEER DIDN'T HAVE SPACE!!!");
        return NO;
      }
    }
    
    
NSStreamDelegate method for handling stream events ("receiving" the data)

The buffer size in this code is 32768 b/c that's what was in whatever example code I learned from.. Is it arbitrary? I tried changing it to 200000, thinking that the problem was just that the buffer was too small, but it didn't change anything.. I don't think I fully understand what's happening. 

    - (void)stream:(NSStream *)aStream handleEvent:(NSStreamEvent)eventCode
    {
      switch (eventCode) {
        
        case NSStreamEventHasBytesAvailable: {
          NSInteger       bytesRead;
          uint8_t         buffer[32768];      // is this the issue?
    //    uint8_t         buffer[200000];   //this didn't change anything
          
          bytesRead = [self.inputStream read:buffer maxLength:sizeof(buffer)];
          if (bytesRead == -1) ...;
          else if (bytesRead == 0) ...;
          else {
            NSData	*data = [NSData dataWithBytes:buffer length:bytesRead];
            [self didReceiveData:data];
          }
        } break;
        
        /*omitted code for other events*/
      }
    }
