Форум программистов, компьютерный форум CyberForum.ru

Чтение с сокета - Objective-C

Войти
Регистрация
Восстановить пароль
 
di_ingenio
 Аватар для di_ingenio
98 / 6 / 1
Регистрация: 14.05.2013
Сообщений: 50
04.09.2013, 11:52     Чтение с сокета #1
Есть метод, который читает данные:
Objective-C
1
2
3
4
5
6
7
8
9
10
+ (void) readAnswer{
    while (isReading) {
        len = [inputStream read:buf maxLength:1024];
        if(len > 0 && len<1024) {
            NSMutableData* data=[[NSMutableData alloc] initWithLength:0];
            [data appendBytes: (const void *)buf length:len];
            NSMutableString* s = [[NSMutableString alloc] initWithData:data encoding:NSUTF8StringEncoding];
        }
    }
}
На строчке len = [inputStream read:buf maxLength:1024]; иногда падает EXC_BAD_ACCESS code=2. Понять не могу в чем проблема. Может, кто сталкивался? Или есть предположения?

Подключение идет так:
Objective-C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
+ (void)connect{
    CFReadStreamRef readStream;
    CFWriteStreamRef writeStream;
    CFStreamCreatePairWithSocketToHost(kCFAllocatorDefault, (__bridge CFStringRef)address, 5555, &readStream, &writeStream);
    //CFReadStreamSetProperty(readStream, kCFStreamNetworkServiceType, kCFStreamNetworkServiceTypeVoIP);
    //CFWriteStreamSetProperty(writeStream, kCFStreamNetworkServiceType, kCFStreamNetworkServiceTypeVoIP);
    inputStream = (__bridge NSInputStream *)readStream;
    outputStream = (__bridge NSOutputStream *)writeStream;
    [inputStream setDelegate:self];
    [outputStream setDelegate:self];
    [inputStream scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];
    [outputStream scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];
    [inputStream open];
    [outputStream open];
    isSocketCreate=true;
}
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
zulkis
 Аватар для zulkis
681 / 608 / 38
Регистрация: 13.01.2011
Сообщений: 1,724
04.09.2013, 12:48     Чтение с сокета #2
buf у вас где? Покажите инициализацию.
di_ingenio
 Аватар для di_ingenio
98 / 6 / 1
Регистрация: 14.05.2013
Сообщений: 50
04.09.2013, 12:52  [ТС]     Чтение с сокета #3
Цитата Сообщение от zulkis Посмотреть сообщение
buf у вас где? Покажите инициализацию.
Objective-C
1
2
3
4
5
6
7
8
9
10
@implementation Socket
NSInputStream *inputStream;
NSOutputStream *outputStream;
NSMutableString *serverMessage;
 
int timeoutMax=200;
int timeout=200;
 
uint8_t buf[1024];
int len = 0;
Вот как-то так.
zulkis
 Аватар для zulkis
681 / 608 / 38
Регистрация: 13.01.2011
Сообщений: 1,724
04.09.2013, 18:22     Чтение с сокета #4
ок, тогда так:
Иногда, как вы говорите, это когда?
di_ingenio
 Аватар для di_ingenio
98 / 6 / 1
Регистрация: 14.05.2013
Сообщений: 50
05.09.2013, 11:46  [ТС]     Чтение с сокета #5
Цитата Сообщение от zulkis Посмотреть сообщение
ок, тогда так:
Иногда, как вы говорите, это когда?
Это, так сказать, плавающий баг. В том-то и дело, что понять не могу почему и в каких ситуациях. Просто иногда падает, а иногда все ок работает. Не знаю почему. Думала, что может, кто-нибудь ошибку очевидную увидит или же уже кто-то сталкивался с такой проблемой.
glvrzzz
95 / 71 / 12
Регистрация: 12.12.2012
Сообщений: 214
12.09.2013, 12:43     Чтение с сокета #6
Цитата Сообщение от di_ingenio Посмотреть сообщение
Objective-C
1
2
3
4
5
6
7
8
9
10
@implementation Socket
NSInputStream *inputStream;
NSOutputStream *outputStream;
NSMutableString *serverMessage;
 
int timeoutMax=200;
int timeout=200;
 
uint8_t buf[1024];
int len = 0;
Вот как-то так.

Я правильно понял, что у вас inputStream глобальный?
NSZombie включали?
есть подозрения, что inputStream деаллочится раньше времени
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
16.09.2013, 13:22     Чтение с сокета
Еще ссылки по теме:

Блокирующее чтение с сокета Java SE
Чтение данных из сокета Java
Непрерывное чтение данных из сокета C++ Qt
C++ Создание сокета
C (СИ) Чтение данных из дескриптора сокета без создания нового буфера

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
di_ingenio
 Аватар для di_ingenio
98 / 6 / 1
Регистрация: 14.05.2013
Сообщений: 50
16.09.2013, 13:22  [ТС]     Чтение с сокета #7
Цитата Сообщение от glvrzzz Посмотреть сообщение
Я правильно понял, что у вас inputStream глобальный?
NSZombie включали?
есть подозрения, что inputStream деаллочится раньше времени
Да, глобальный, NSZombie я включала, но ничего необычного не заметила. Но еще раз проверю.

Добавлено через 23 минуты
Если конкретнее, то падает тут
Objective-C
1
2
#0  0x312701cc in CFBasicHashGetBucket ()
#12 0x3129e5d6 in CFReadStreamRead ()
Yandex
Объявления
16.09.2013, 13:22     Чтение с сокета
Ответ Создать тему
Опции темы

Текущее время: 19:21. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru