Frage

Ich habe einen iOS-Client mit einem Linux C-Server über TCP / IP eingerichtet. Das Problem, mit dem ich konfrontiert bin, ist: Nachdem die Verbindung hergestellt wurde, wartet der Server auf Daten (read ()) und zeigt sie auf dem Bildschirm an, sobald sie vom iPod empfangen wurden. Dann geht es wieder zurück zu read () und so weiter. Ich kann dies einmal lesen / schreiben, aber nicht dauerhaft. Der Code lautet:

-(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;

OK. Soweit ich weiß, werden diese Methode und dieser Fall automatisch ausgeführt, sobald auf der Serverseite ein Lesevorgang erfolgt. Dies funktioniert hervorragend beim ersten Aufruf von read () auf dem Server, aber beim zweiten Aufruf bleibt der Server nur für einige Daten hängen. Das Protokoll, das ich in xcode habe, zeigt, was passiert:

2011-06-17 16: 23: 50.154 sliderFinal [7430: 207] >>: NSStreamEventOpenCompleted // Einer der Streams wurde geöffnet

2011-06-17 16: 23: 50.156 sliderFinal [7430: 207] <<: NSStreamEventOpenCompleted // Der andere Stream wurde geöffnet

2011-06-17 16: 23: 50.157 sliderFinal [7430: 207] Gesendete Daten // Die Daten wurden nach dem ersten read () vom Server gesendet

2011-06-17 16: 23: 50.159 sliderFinal [7430: 207] <<: NSStreamEventHasSpaceAvailable // Dies bezieht sich auf den ersten read () -Aufruf vom Server

Ich sehe, dass der Server nach der ersten Runde auf etwas wartet. Diese Nachricht scheint den NSStreamEventHasSpaceAvailable einfach nicht mehr zu erreichen. Irgendwelche Ideen?

War es hilfreich?

Lösung

Scheint, als hätte ich es geschafft.Ich weiß nicht genau, ob der Code, den ich in meiner Frage gepostet habe, Fehler enthielt (ich glaube nicht, weil er tatsächlich die gewünschte Nachricht gesendet hat), aber am Ende habe ich eine andere Schreibweise verwendet.

Dies war die verwendete Methode:

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

Und dies ist der Code, den ich verwendet habe (anstelle des in der Frage angegebenen):

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;

Außerdem habe ich festgestellt, dass der Server nach read () und printf (msg) eine Nachricht anzeigt, dass die Verbindung beendet wurde, also ichDer Code auf der Serverseite, auf der überprüft wurde , ob der Server noch mit dem Client verbunden war, wurde folgendermaßen geändert:

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

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

..zu diesem:

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

Es scheint den Trick getan zu haben.Jetzt wird die Verbindung nicht umsonst getrennt.Problem gelöst.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top