免责声明:我是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 ;
}
答案 0 :(得分:10)
这是C级问题:你对缓冲区和指针感到困惑。
此代码:
uint8_t *buffer[1024];
给你一个1024个指向uint8_t
的指针的堆栈缓冲区,这几乎肯定不是你想要的。代替:
uint8_t buffer[1024];
稍后,您将堆栈上指针的地址传递给 - [NSMutableData appendBytes:length:],这也不是您想要的:在the documentation中,传递第一个元素:< / p>
[data appendBytes:buffer length:len];
有一个very thorough programming guide包含您正在尝试执行的操作的完整代码,您可能需要参考它。
至于__TERMINATING_DUE_TO_UNCAUGHT_EXCEPTION__
,内存损坏和错误的指针解除引用不是你可以用Objective-C @try
/ @catch
捕获的;它的水平要低得多。另一方面,如果打开调试,你仍然可以在调试器中捕获它。
答案 1 :(得分:7)
将您的缓冲区声明为:
uint8_t buffer[1024];
并将其追加为:
[data appendBytes:buffer length:len];
答案 2 :(得分:2)
为了完整性read:maxLength:
返回NSInteger,如果出现错误则为负数。将它分配给unsigned int会丢弃这个并导致崩溃。