Клиент iPod постоянно отправляет данные на сервер C? - PullRequest
0 голосов
/ 17 июня 2011

У меня есть клиент iOS, настроенный с сервером Linux C через TCP / IP.Проблема, с которой я сталкиваюсь, заключается в следующем: после того, как соединение установлено, сервер ожидает данные (read ()) и представляет их на экране, полученном от iPod.Затем снова возвращается к read () и так далее.Я могу сделать это чтение / запись один раз, но не навсегда.Код:

-(void)stream:(NSStream *)theStream handleEvent:(NSStreamEvent)streamEvent

      case NSStreamEventHasSpaceAvailable:
         event = @"NSStreamEventHasSpaceAvailable";
        connectButton.enabled = NO;
        disconnectButton.enabled = YES;

        if (theStream == oStream)
         {
         //send data                

             uint8_t buffer[11] = "I send this";             
             int len;

             len = [oStream write:buffer maxLength:sizeof(buffer)];
             if (len > 0)
            {
                NSLog(@"Data sent");
                [oStream close];
            }
         }

        break;

ОК.Итак, насколько я знаю, этот метод и случай будут запускаться автоматически, как только произойдет чтение на стороне сервера.Это прекрасно работает при первом вызове read () на сервере, но при втором вызове сервер просто зависает для некоторых данных.Журнал, который у меня есть в xcode, показывает, что происходит:

2011-06-17 16: 23: 50.154 sliderFinal [7430: 207] >>: NSStreamEventOpenCompleted // Один изпотоки были открыты

2011-06-17 16: 23: 50.156 sliderFinal [7430: 207] <<: NSStreamEventOpenCompleted </strong> // Другой поток был открыт

2011-06-17 16: 23: 50.157 sliderFinal [7430: 207] Данные отправлены // Данные были отправлены после первого чтения () с сервера

2011-06-17 16: 23: 50.159 sliderFinal [7430: 207] <<: NSStreamEventHasSpaceAvailable </strong> // Это относится к первому вызову read () изсервер

Я вижу, что после первого раунда сервер продолжает что-то ждать.Кажется, что это сообщение снова не достигает NSStreamEventHasSpaceAvailable.Есть идеи?

1 Ответ

0 голосов
/ 18 июня 2011

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

Был использован этот метод:

 -(NSInteger) writeToServer:(const uint8_t *) buf 
  {
     return [oStream write:buf maxLength:strlen((char*)buf)];    
  }

И этот код, который я использовал (вместо того, который выложили в вопросе):

case NSStreamEventHasSpaceAvailable:
    event = @"NSStreamEventHasSpaceAvailable";
        connectButton.enabled = NO;
        disconnectButton.enabled = YES;

        if (theStream == oStream)
         {
         //send data

             NSString *msg = [[NSString alloc] initWithFormat:@"ping"];
             const uint8_t *buffer = (const uint8_t *)[msg UTF8String];  
             NSInteger err = [self writeToServer:buffer];
             [msg release];

             if ( err == -1)
                 NSLog(@"Error sending data."); 
             else   
                 NSLog(@"Success sending data.");

break;

Также я заметил, что сервер после read () и printf (msg) выдаст мне сообщение о том, что соединение было разорвано, поэтому я изменил код на стороне сервера, где у меня была проверка , был ли сервер все еще подключен к клиенту, например:

check = recv(newsockf,buffer,256, MSG_PEEK|MSG_DONTWAIT);

if(!(check < 0 && errno == EAGAIN))
{
  //close socket;
  //accept();
}

.. к этому:

if((check < 0 && errno != EAGAIN))
{
  //close socket;
  //accept();
}

Кажется, это удалось. Теперь это не отключается даром. Проблема решена.

...