AsyncSockets - ReadToData - работает не так, как ожидалось - PullRequest
0 голосов
/ 31 января 2012

Это мой первый конкретный вопрос здесь о stackoverflow, потому что я пока не смог найти каких-либо полезных решений для своей проблемы.Мне нужно низкоуровневое сокетное соединение между моим iPhone и рабочей станцией OSX (в качестве TCP-сервера) для обмена некоторыми мультимедийными данными, такими как изображения или аудиофайлы.Поэтому я думаю, что AsyncSockets - хороший выбор, чтобы заставить это работать.Я часто использовал это для какой-то крошечной байтовой связи.

Моя проблема в том, что я хочу использовать своего рода заголовок / протокол, чтобы сообщить серверу, сколько байтов данных все еще находится в канале.Простое общение, такое как «hello world», работает нормально, поэтому проблем с подключением нет.

Мобильное устройство (которое хочет отправить изображение) выполняет следующие действия.

[self setHost:@"172.22.42.207"];
self.socket = [[[AsyncSocket alloc] initWithDelegate:self] autorelease];

NSError *err = nil;
[[self socket] connectToHost:self.host onPort:5009 error:&err];

...

NSData *t = UIImagePNGRepresentation(test);

NSString *header = [NSString stringWithFormat:@"%i", t.length];
NSMutableData *headerData = [[header dataUsingEncoding:NSUTF8StringEncoding] mutableCopy];
[headerData appendBytes:[AsyncSocket CRLFData] length:[[AsyncSocket CRLFData] length]];

[[self socket] writeData:headerData withTimeout:-1 tag:0];

Сервер слушает так:

AsyncSocket *s = [[AsyncSocket alloc] initWithDelegate:self];
NSError *err = nil;
[s acceptOnPort:5009 error:&err];

if(err)
    NSLog(@"EPIC FAIL...\n%@", err);

....

- (void)onSocket:(AsyncSocket *)sock didAcceptNewSocket:(AsyncSocket *)newSocket
{
   NSLog(@"%s", __PRETTY_FUNCTION__);    
   [newSocket readDataToData:[AsyncSocket CRLFData] withTimeout:-1 tag:0];
}

Сейчас: если я использую readData: withTimeout: tagвсе работает как шарм.Но как только я изменяю код на тег readDataToData: withTimeout: для отделения заголовка от другого содержимого, метод onSocket: didConnectToHost: port: никогда не вызывается.Вот несколько симпатичных журналов функций (я поместил их в каждый метод делегата)

Client side:
2012-01-31 13:40:32.962 AVMobile[20643:10703] -[SLViewController onSocket:didConnectToHost:port:]
2012-01-31 13:40:32.964 AVMobile[20643:10703] -[SLViewController onSocket:didWriteDataWithTag:]

Server side: 
2012-01-31 13:40:32.961 AVServer[20618:707] -[SLAppDelegate onSocket:didAcceptNewSocket:]

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

Sending:    <33333736 35365cba>
Receiving:  <33333736 35365cba>

Да ... теперь мой последний вопрос: что я делаю не так !?Почему у меня не получается :)?

Привет и спасибо!sniperosx

1 Ответ

0 голосов
/ 07 февраля 2012

Нашли решение:

Просто не используйте -1 в качестве тайм-аута.При тайм-ауте -1 AsyncSocket читает данные, пока другая сторона не закроет соединение, поэтому в этом диапазоне не вызывается метод делегата.

Cheerz sniperosx

[Закрыто]

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