Ну, по крайней мере, неожиданно для меня ... Это ситуация
Я открываю сокет, используя следующий код:
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
Теперь, что идет не так: весь этот код работает отлично, пока я остаюсь в приложении, даже если я выхожу из приложения и снова вхожу, он все еще работает нормально. Если я вхожу в режим ожидания, когда приложение открыто, оно также работает нормально. Однако, если я выйду из приложения, переведу телефон в режим ожидания, вытащу телефон из режима ожидания и снова войду в приложение, немедленно будет вызван обратный вызов с типом события kCFStreamEventHasBytesAvailable, хотя я уверен на 100%, что ни одного байта не было отправлено. Если я затем вызываю CFReadStreamRead, он возвращает мне -1, поскольку это означает, что произошла ошибка. Я выяснил код ошибки, равный 57, это означает, что сокет был закрыт.
Я пропускаю определенный аспект программирования сокетов на iPhone? Я должен признать, что я новичок в этом. Разве невозможно оставить TCP-сокет открытым, находясь вне приложения (и переходя в режим ожидания)?
Я попытался снова вызвать CFReadStreamOpen, который вернул мне значение false.
Я здесь потерян, пожалуйста, помогите!
Заранее спасибо