Сокеты потоков Objective-C "Плохой дескриптор файла" - PullRequest
0 голосов
/ 03 июня 2010

Я пытаюсь создать простой IRC-клиент, просто для удовольствия, и попытаться узнать немного больше о программировании сокетов в задаче C.

Итак, я посмотрел пример кода и понятия не имею, почему я не могу отправить или получить сообщение при подключении. Сначала я подключаюсь к серверу, используя следующий код:

if (![urlString isEqualToString:@""]) {
    NSURL* url = [NSURL URLWithString:urlString];
    if(!url){
        [self writeToOutput:@"Invalid Url"];
        return;
    }

    [self writeToOutput:@"Attempting Connection\n"];

    CFReadStreamRef readStream;
    CFWriteStreamRef writeStream;
    CFStreamCreatePairWithSocketToHost(NULL, (CFStringRef)[url host], 6667, &readStream, &writeStream);

    if(!readStream || !writeStream){
        [self writeToOutput:@"Connection Failed!\n"];
        return;
    }

    _inputStream = (NSInputStream *)readStream;
    _outputStream = (NSOutputStream *)writeStream;
    [_inputStream setDelegate:self];
    [_outputStream setDelegate:self];
    [_inputStream scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];
    [_outputStream scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];
    [_inputStream open];
    [_outputStream open];
    [self writeToOutput:@"Connection Successful!\n"];
}

Затем я использую следующее для чтения / записи из потоков:

case NSStreamEventHasBytesAvailable:
        if (stream == _inputStream)
        {
            //read data
            uint8_t buffer[1024];
            int len;
            while ([_inputStream hasBytesAvailable])
            {
                len = [_inputStream read:buffer maxLength:1024];
                if (len > 0)
                {
                    NSString *output = [[NSString alloc] initWithBytes:buffer length:len encoding:NSASCIIStringEncoding];
                    if (output != nil)
                    {
                        [self writeToOutput:output];
                    }
                }
            }
        }
        break;

    case NSStreamEventHasSpaceAvailable:
        if (stream == _outputStream)
        {
                const uint8_t *rawString=(const uint8_t *)[message UTF8String];         
                int len;

                len = [_outputStream write:rawString maxLength:[message length]];

                [self writeToOutput:[NSString stringWithFormat:@"%@\n",message]];
            }
        }
        break;

Когда я получаю событие NSStreamEventHasBytesAvailable, никакое сообщение не читается (len == 0), и когда я записываю в выходной поток, я получаю ошибку "Bad File Descriptor".

Отправляемые / получаемые сообщения являются просто строками, я скопировал / вставил много кода с сайта разработчиков Apple, но я думаю, что в основном понимаю, что происходит, и не могу понять, почему он не дает мне что-то !

Есть идеи или я просто не на той странице?

P.S. writeToOutput - это запись в вывод на экране, а не в выходной поток. Запутывая названия, я должен изменить это ...

1 Ответ

0 голосов
/ 04 июня 2010

Решение было на самом деле описано здесь, используя класс AsyncSocket ссылка AsyncSocket

Однако, если бы кто-нибудь мог сказать мне, что случилось с вышесказанным, это было бы здорово. Насколько я знаю, класс сокетов Async - это просто оболочка для функций, которые у меня есть выше, не так ли?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...