嗯,至少意外對我來說...這是情況: 我用下面的代碼打開一個套接字: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