I am creating an application similar to WiTap (but for connecting many devices), and here is my problem: the application seems to connect devices (they are displayed in the table view controller. The delegate from NSInput/OutputStream says that both streams but when I send the packet to NSOutputStream than the function on the opposite device with NSInputStream does not receive a call (NSStreamEventHasBytesAvailible in - (void)stream:(NSStream *)aStream handleEvent:(NSStreamEvent)eventCode) .
Here is the code that makes the connection, sends and receives ...
//Service was resolved - (void)netServiceDidResolveAddress:(NSNetService *)netService { //Get the streams from NSNetService NSInputStream *inStream = nil; NSOutputStream *outStream = nil; [netService getInputStream:&inStream outputStream:&outStream]; [inStream setDelegate:self]; [inStream scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSRunLoopCommonModes]; [inStream open]; [outStream setDelegate:self]; [outStream scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSRunLoopCommonModes]; [outStream open]; [self.inStreams addObject:inStream]; [self.outStreams addObject:outStream]; //Add NSNetService between connected devices [self.resolvedServices addObject:netService]; [self updateUI]; } //event handling - (void)stream:(NSStream *)aStream handleEvent:(NSStreamEvent)eventCode { switch (eventCode) { case NSStreamEventHasBytesAvailable: { NSMutableData *inBuffer = [[NSMutableData alloc] init]; NSInputStream *inStream = (NSInputStream *)aStream; uint8_t buffer[3]; NSInteger len = 0; NSInteger packetNumber = 0; len = [inStream read:buffer maxLength:3]; if(len > 0) { [inBuffer appendBytes:buffer length:len]; [inBuffer getBytes:&packetNumber length:len]; [self.delegate stream:inStream didReceivePacketNumber:[NSNumber numberWithInteger:packetNumber]]; } } break; case NSStreamEventHasSpaceAvailable: if ([aStream isKindOfClass:[NSOutputStream class]]) NSLog(@"NSStream \"%@\" has space availible",aStream); break; case NSStreamEventOpenCompleted: if ([aStream isKindOfClass:[NSInputStream class]]) NSLog(@"NSInputStream opened"); else if ([aStream isKindOfClass:[NSOutputStream class]]) NSLog(@"NSOutputStream opened"); break; case NSStreamEventErrorOccurred: NSLog(@"NSStream \"%@\" occurred an error: %@",aStream,[aStream streamError]); break; case NSStreamEventEndEncountered: NSLog(@"Stream \"%@\" has been closed",aStream); [aStream removeFromRunLoop:[NSRunLoop currentRunLoop] forMode:NSRunLoopCommonModes]; [aStream close]; NSUInteger index = 0; if ([aStream isKindOfClass:[NSOutputStream class]]) { index = [self.outStreams indexOfObject:aStream]; [self.outStreams removeObject:aStream]; [self.inStreams removeObjectAtIndex:index]; } else if ([aStream isKindOfClass:[NSInputStream class]]) { index = [self.inStreams indexOfObject:aStream]; [self.inStreams removeObject:aStream]; [self.outStreams removeObjectAtIndex:index]; } [self.availibleServices removeObjectAtIndex:index]; [self.resolvedServices removeObjectAtIndex:index]; break; default: break; } } //sending //Data pushing into NSStreams - (void)sendData:(NSData *)data toStream:(NSOutputStream *)aStream { if ([aStream hasSpaceAvailable]) { NSLog(@"%i",[aStream write:[data bytes] maxLength:[data length]]); } }
I tried to debug the project using tools (network thing). He says the packet is sent and received, but the event never happens. Thanks for the help. If someone wants, I have nothing to send the whole project ...
source share