【问题标题】:iOS to linux connection using sockets使用套接字的 iOS 到 linux 连接
【发布时间】:2016-06-09 16:26:08
【问题描述】:

我想使用套接字将 iphone 连接到我的 linux 机器。我在 linux 上运行服务器程序并将套接字保持在侦听模式并尝试从我的 iphone 发送字符串。但无法连接到linux机器。我试过 CFStream api。对于连接,我使用了端口 3000 。我的代码如下:

- (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");

    }
}

【问题讨论】:

  • 程序卡在 CFStreamCreatePairWithSocketToHost(NULL, (CFStringRef)@"192.168.1.62",3000, &readStream, &writeStream);并进入无限循环

标签: ios iphone linux sockets


【解决方案1】:

我得到了解决方案。我犯了一些错误。在视图中注释两行确实加载并在 initNetworkCommunication 中添加两行解决的问题更正代码如下。

- (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];
}

【讨论】:

    猜你喜欢
    • 2016-04-21
    • 1970-01-01
    • 2013-10-14
    • 1970-01-01
    • 1970-01-01
    • 2013-07-20
    • 2018-01-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多