嗯,至少意外对我来说...这是情况: 我用下面的代码打开一个套接字:iPhone插座被关闭意外
CFStreamCreatePairWithSocketToHost(kCFAllocatorDefault, (CFStringRef)ipaddress , 3333,&readStream, &writeStream);
if(!CFReadStreamOpen(readStream) || !CFWriteStreamOpen(writeStream))
{
UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Connection error"
message:@"There has been a connection error, please ensure your internet connection is working"
delegate:self
cancelButtonTitle:@"OK"
otherButtonTitles:nil];
[alert show];
return;
}
这一切都很好,我做的下一件事就是建立回调:
CFStreamClientContext ctxt = {0,(void*)NULL,NULL,NULL,NULL};
static const CFOptionFlags kReadNetworkEvents = kCFStreamEventEndEncountered |
kCFStreamEventErrorOccurred |
kCFStreamEventHasBytesAvailable |
kCFStreamEventOpenCompleted |
kCFStreamEventNone;
CFReadStreamSetClient(readStream, kReadNetworkEvents, ReadStreamClientCallBack, &ctxt);
CFReadStreamScheduleWithRunLoop(readStream, CFRunLoopGetCurrent(), kCFRunLoopDefaultMode);
而且工作得很好,我将列出回调方法来完成:
static void ReadStreamClientCallBack(CFReadStreamRef stream, CFStreamEventType type, void *clientCallBackInfo) {
switch (type)
{
case kCFStreamEventEndEncountered:
{
break;
}
case kCFStreamEventErrorOccurred:
break;
case kCFStreamEventHasBytesAvailable:
{
[this stopListen];
UInt8 buffer[1024];
int count = CFReadStreamRead(stream, buffer, 1024);
CFStreamStatus status = CFReadStreamGetStatus(this.readStream);
CFErrorRef error = CFReadStreamCopyError (this.readStream);
CFStringRef errorCode = CFErrorCopyDescription(error);
// Bunch of other irrelevant code
现在出了什么问题:只要我留在应用程序中,所有这些代码都可以正常工作,即使我退出应用程序并再次输入它仍然可以正常工作。如果我在应用程序打开时进入待机状态,它也可以正常工作。但是,如果我退出应用程序,将手机置于待机状态,让手机退出待机状态,然后重新进入应用程序,即使我已100%确定没有发送字节,立即使用eventtype kCFStreamEventHasBytesAvailable调用回拨。如果我然后调用CFReadStreamRead,它会向我返回-1,因为这意味着发生了一个错误,我计算出错误代码是57,这意味着套接字已关闭。
我是否忽略了iPhone上套接字编程的某些方面?我必须承认我是新手。在应用程序外(并进入待机状态),是否可以保持TCP套接字处于打开状态? 我试图再次调用CFReadStreamOpen,它返回false给我。
我迷路了,请帮忙!
在此先感谢在4.0以上的多任务处理功能
你在使用什么操作系统版本? – slf 2010-11-16 14:13:34
我正在使用OS 4.1,但是昨天我做了一个3.2版本,并且发生了错误。 – loconero 2010-11-16 14:21:39