2016-03-19 7 views
0

Ich verwende einen TCP-Server (nur an 127.0.0.1 und einen zufälligen Port binden) aus irgendeinem Grund (plattformübergreifend verwandt) in meiner App. Ich benutze die Posix-Funktion select, um zu überprüfen, ob es eine neue TCP-Verbindung gibt. Es funktioniert gut die meiste Zeit, aber wenn ich: 1) drücken Sie die Home-Taste, Bildschirm sperren. 2) entsperren Bildschirm, App-Symbol drücken Sie sofort zurück zur App.iOS hören Socket wird schlechter Dateideskriptor nach Bildschirmsperre

Die select Funktion zurückkehrt, sagt mir, ich meine Server-Socket umgehen kann, nachdem ich accept Funktion aufrufen, gibt sie -1 zurück, und dann überprüfe ich die SO_ERROR von getsockopt, EBADF den Fehler zurück. Codes unter:

//listen fd is already nonblocking 
if ((*pa = accept(*ps, addr, len)) != -1){ 
    printf("after accept %d %d\n", *pa, errno); 
    return IO_DONE; 
} 

printf("after accept error %d %d %d %s\n", *ps, *pa, errno, strerror(errno)); 

int error = 0; 
socklen_t len = sizeof (error); 
int retval = getsockopt (*ps, SOL_SOCKET, SO_ERROR, &error, &len); 
if (retval != 0) { 
    /* there was a problem getting the error code */ 
    fprintf(stderr, "error getting socket error code: %s\n", strerror(retval)); 
} 

if (error != 0) { 
    /* socket has a non zero error status */ 
    fprintf(stderr, "socket error: %s\n", strerror(error)); 
} 

log:

after accept error 5 -1 35 Resource temporarily unavailable 
socket error: Bad file descriptor 

Mein Testgerät ist ein iPhone 4s, OS-Version ist iOS 8.4.1

Ich habe bereits https://developer.apple.com/library/ios/documentation/NetworkingInternetWeb/Conceptual/NetworkingOverview/CommonPitfalls/CommonPitfalls.html und ich habe nichts falsch gefunden.

Also, warum dies geschieht und wie zu lösen?

+0

ein besonderer Grund Sie die Abhörsocket nicht blockierend gemacht? Wenn Sie auswählen, wird accept vor dem Aufruf von accept nicht blockiert. Der Fehler, den du von accept erhältst, ist kein echter Fehler, sondern nur, weil der abhörende Socket nicht blockiert ist, und darauf hinweist, dass die akzeptierte Verbindung noch nicht fertig ist. Lassen Sie die hörende Buchse blockieren, die meistens wahrscheinlich weggeht. – alk

Antwort

1

https://github.com/robbiehanson/CocoaHTTPServer/issues/10 Ich stieß auf das gleiche Problem.

Die Anwendung muss die Benachrichtigungen UIApplicationWillResignActionNotification und UIApplicationWillEnterForegroundNotification beachten und den Server entsprechend stoppen und neu starten.

Es ist auch wichtig, den ursprünglichen Server-Port zu erhalten, da die Webansicht nicht in der Lage sein, Ressourcen von einem anderen Port zu laden. „ “

+0

Danke @megar, ich werde es versuchen. – llj098

Verwandte Themen