2016-06-07 7 views
0

Ich möchte iPhone mit meinem Linux-Computer mit Sockets verbinden. Ich habe Server-Programm auf Linux ausgeführt und hielt Socket im Abhörmodus und versuchte, Zeichenfolge von meinem iPhone zu senden. Aber keine Verbindung zum Linux-Rechner. Ich habe CFStream api ausprobiert. Für die Verbindung habe ich Port 3000 benutzt. Mein Code ist wie folgt:iOS zu Linux-Verbindung mit Sockets

- (void)viewDidLoad { 

    [super viewDidLoad]; 

    NSLog(@"view did load"); 
    data = [[NSMutableData alloc] init]; 
    outputStream = [[NSOutputStream alloc] initToMemory]; 
    inputStream = [[NSInputStream alloc] init]; 
    [self initNetworkCommunication]; 

    [self sendString:@"Hello World\n"] 

} 
- (void)initNetworkCommunication { 

    CFStreamCreatePairWithSocketToHost(NULL, (CFStringRef)@"192.168.1.62",3000, &readStream, &writeStream); 

    inputStream = (__bridge NSInputStream *)(readStream); // ivar 
    [inputStream setDelegate:self]; 
    [inputStream scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode]; 
    [inputStream open]; 

    outputStream = (__bridge NSOutputStream *)(writeStream); // ivar 
    [outputStream setDelegate:self]; 
    [outputStream scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode]; 
    [outputStream open]; 
} 

-(void)sendString:(NSString *)string { 

    NSLog(@"data string:%@",string); 
    if(!CFWriteStreamOpen(writeStream)){ 
     NSLog(@"Error, writeStream not open"); 

    //[outputStream close]; 
    } 
    NSLog(@"Status of outputStream: %i", [outputStream streamStatus]); 

    NSData *data = [[NSData alloc] initWithData:[string dataUsingEncoding:NSASCIIStringEncoding]]; 

    [outputStream write:[data bytes] maxLength:[data length]]; 
} 
-(void)stream:(NSStream *)theStream handleEvent:(NSStreamEvent)streamEvent { 

    NSLog(@"thestream:%@",theStream); 
    NSLog(@"stream event %lu", (unsigned long)streamEvent); 
    BOOL byteIndex = nil; 

    switch (streamEvent) { 
     case NSStreamEventOpenCompleted: 
      NSLog(@"Stream opened"); 
      break; 
     case NSStreamEventHasSpaceAvailable: { 
      uint8_t *readBytes = (uint8_t *)[data mutableBytes]; 
      readBytes += byteIndex; // ivar 
      int data_len = [data length]; 
      unsigned int len = ((data_len - byteIndex >= 1024) ? 1024 : (data_len - byteIndex)); 
      uint8_t buf [len]; 
      (void)memcpy(buf, readBytes, len); 
      len = [(NSOutputStream *)theStream write:(const uint8_t *)buf maxLength:len]; 
      NSLog(@"Sending buffer of len: %d", len); 
      byteIndex += len; 
      break; 
     } 
     case NSStreamEventHasBytesAvailable: 
      NSLog(@"the stream:%@, inputStream:%@",theStream,inputStream); 
      if (theStream == inputStream) { 
       uint8_t buffer[1024]; 
       int len; 

       while ([inputStream hasBytesAvailable]) { 
        len = [inputStream read:buffer maxLength:sizeof(buffer)]; 
        if (len > 0) { 
         NSString *output = [[NSString alloc] initWithBytes:buffer length:len encoding:NSASCIIStringEncoding]; 

         if (nil != output) { 
          NSLog(@"server said: %@", output); 
         } 
        } 
       } 
       [self sendString:@"Another Test"]; 
      } 
       break; 

     case NSStreamEventErrorOccurred: 
      theError = [theStream streamError]; 
      NSString * event = [[NSString alloc]initWithFormat:@"NSStreamEventErrorOccurred %@ ",theError]; 
      NSLog(@"Can not connect to the host!:%@",event); 
      break; 
//  case NSStreamEventEndEncountered: 
//   NSLog(@"Closing stream..."); 
//   [theStream close]; 
//   [theStream removeFromRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode]; 
//   //[theStream release]; 
//   theStream = nil; 
//   break; 
//  default: 

//   NSLog(@"Unknown event"); 

    } 
} 

+0

Programm bei CFStreamCreatePairWithSocketToHost stecken (NULL, (CFStringRef) @ "192.168.1.62", 3000, und Readstream & Writestream); und geht in die Endlosschleife – Prajakta

Antwort

0

ich die Lösung. Ich habe einige Fehler gemacht. Das Kommentieren von zwei Linien in der Ansicht lud und das Hinzufügen von zwei Linien in initNetworkCommunication löste Problem korrigierter Code ist wie unten.

- (void)viewDidLoad { 

    [super viewDidLoad]; 

    NSLog(@"view did load"); 
    data = [[NSMutableData alloc] init]; 
    // outputStream = [[NSOutputStream alloc] initToMemory]; // Commented this two lines 
    // inputStream = [[NSInputStream alloc] init]; 
    [self initNetworkCommunication]; 

    [self sendString:@"Hello World\n"] 

} 
- (void)initNetworkCommunication { 



//My program stuck at CFStreamCreatePairWithSocketToHost. I declared this two objects globally but it didn't work then I declared it here now it works 
    CFReadStreamRef readStream ; 
    CFWriteStreamRef writeStream ; 

    CFStreamCreatePairWithSocketToHost(NULL, (CFStringRef)@"192.168.1.62",3000, &readStream, &writeStream); 

    inputStream = (__bridge NSInputStream *)(readStream); // ivar 
    [inputStream setDelegate:self]; 
    [inputStream scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode]; 
    [inputStream open]; 

    outputStream = (__bridge NSOutputStream *)(writeStream); // ivar 
    [outputStream setDelegate:self]; 
    [outputStream scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode]; 
    [outputStream open]; 
}