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?
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