代码之家  ›  专栏  ›  技术社区  ›  Dutchie432

iPhone SDK-nsstreamEventHasBytesAvailable/AppendBytes:崩溃

  •  3
  • Dutchie432  · 技术社区  · 17 年前

    免责声明:我是xcode/iphone sdk noob。

    我正在尝试与现有服务器建立客户端TCP/IP连接。连接后,我希望收到一些关于服务器的数据(版本等)。

    当我接通时, NSStreamEventOpenCompleted 事件触发,所以我知道连接已建立。下一个 NSStreamEventHasBytesAvailable 事件激发,我正在执行以下代码。值71(int)存储在len中,我认为这是正确的。然而,这条线

    [data appendBytes:&buffer length:len];
    

    正在崩溃(我想)。没有实际抛出的错误,但我确实看到了 __TERMINATING_DUE_TO_UNCAUGHT_EXCEPTION__ 尽管我已经明确地添加了错误捕获:

    case NSStreamEventHasBytesAvailable:
        {
            NSMutableData *data=[[NSMutableData alloc] init];
    
            uint8_t *buffer[1024];
            unsigned int len=0;
    
            len=[(NSInputStream *)stream  read:buffer maxLength:1024];
            if(len>0){  
                @try{
                    [data appendBytes:&buffer length:len];
                }
                @catch(NSException *ex){
                    NSLog(@"Fail: %@", ex); 
                }
                [statusLabel setText:[data stringValue]];
                //[bytesRead setIntValue:[bytesRead intValue]+len];
            }else{
                NSLog(@"No Buffer");
            }
            break ;
        }
    
    3 回复  |  直到 17 年前
        1
  •  7
  •   Jim Puls    17 年前

    将缓冲区声明为:

    uint8_t buffer[1024];
    

    附加为:

    [data appendBytes:buffer length:len];
    
        2
  •  10
  •   Jim Puls    17 年前

    在C层,这是一个问题:您对缓冲区和指针感到困惑。

    此代码:

    uint8_t *buffer[1024];
    

    为您提供1024个指针的堆栈缓冲区 uint8_t 这几乎肯定不是你想要的。而是:

    uint8_t buffer[1024];
    

    稍后,您将把堆栈上指针的地址传递给-[nsmutabledata appendbytes:length:],这也是您不想要的:如中所示 the documentation ,传递第一个元素:

    [data appendBytes:buffer length:len];
    

    有一个 very thorough programming guide 有了完整的代码,您可以参考它。

    至于 __TERMINATING_DUE_TO_UNCAUGHT_EXCEPTION__ ,内存损坏和错误的指针取消引用不是您可以用Objective-C捕捉到的。 @try / @catch 水平要低得多。另一方面,如果启用调试,您仍然可以在调试器中捕获到这一点。

        3
  •  2
  •   Dutchie432    15 年前

    为了完整性 read:maxLength: 返回nsinteger,如果出现错误,则为负数。将其分配给无符号int将丢弃此项,并可能导致崩溃。