iPod-Client sendet permanent Daten an C-Server?
-
29-10-2019 - |
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?
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.