Проблемы с получением данных из CFStreamCreatePairWithSocketToHost - PullRequest
0 голосов
/ 09 июня 2010

Я создаю приложение iPhoe с сокетом для ПК-приложения, мне нужно получить изображение из этого ПК-приложения. Я впервые использую «CFStreamCreatePairWithSocketToHost». После того как я устанавливаю сокет с «NSOperation», я вызываю

<code>
CFStreamClientContext streamContext = {0, self, NULL, NULL, NULL};
BOOL success = CFReadStreamSetClient(myReadStream, kMyNetworkEvents,MyStreamCallBack,&streamContext);
CFReadStreamScheduleWithRunLoop(myReadStream, CFRunLoopGetCurrent(), kCFRunLoopDefaultMode);
тогда я звоню
<code>
CFWriteStreamWrite(myWriteStream, &writeBuffer, 3);
// Open read stream.
 if (!CFReadStreamOpen(myReadStream)) {
  // Notify error
 }
.
.
.
while(!cancelled && !finished) {
  SInt32 result = CFRunLoopRunInMode(kCFRunLoopDefaultMode, 0.25, NO);</p>

<p>if (result == kCFRunLoopRunStopped || result == kCFRunLoopRunFinished) {
   break;
  }</p>

<p>if (([NSDate timeIntervalSinceReferenceDate] - _lastRead) > MyConnectionTimeout) {
   // Call timed out
   cancelled = YES;</p>

<p>break;
  }</p>

<p>// Also handle stream status 
  CFStreamStatus status = CFReadStreamGetStatus(myReadStream);
 }
а затем, когда я получаю "kCFStreamEventHasBytesAvailable" я использую
<code>
while (CFReadStreamHasBytesAvailable(myReadStream))
{
   CFReadStreamRead(myReadStream, readBuffer, 1000);
//and buffer the the bytes
}
Это непредсказуемо, иногда я получаю полную картину, иногда я получаю только ее часть, и я не могу понять, что делает другое. может у кого-то есть идея, что тут не так? спасибо

1 Ответ

2 голосов
/ 15 октября 2010

Когда вы получаете kCFStreamEventHasBytesAvailable, возможно, что доступны только некоторые байтов, а оставшиеся байты не поступят позже.

Представьте, что вы ожидаете всего5000 байт.

Из-за непредсказуемого времени сети это один сценарий:

  1. Два пакета, каждый из которых содержит 1000 байтов, поступают почти сразу.
  2. Ваш обратный вызоввызывается с помощью kCFStreamEventHasBytesAvailable, поскольку ожидается 2000 байт.
  3. Вы циклически выполняете цикл, хотя цикл while дважды, каждый раз потребляя 1000 байтов.
  4. Цикл while завершается, посколькуCFReadStream не имеет больше доступных байтов. Распознает ли ваш код, что у вас еще нет всех ваших данных, хотя в настоящее время больше нет ожидающих байтов?
  5. Приходит еще один пакет, содержащий 1000 байтов.
  6. Ваш обратный вызов вызывается снова с kCFStreamEventHasBytesAvailable, поскольку ожидается еще 1000 байтов. Готовы ли вы к этому второму обратному вызову?
  7. Шаги 5 и 6 выполняются вдвое больше.
...