私のアプリケーションで何らかの理由で(クロスプラットフォームに関連する)TCPサーバー(127.0.0.1とランダムポートにバインド)を使用します。私はposix関数select
を使って新しいtcp接続があるかどうかを調べます。それはほとんどの時間、うまく動作しますが、私は:1)ホームボタンを押し、画面をロックします。 2)画面のロックを解除するには、Appアイコンを押してすぐにAppに戻ってください。iOSリスンソケットが画面ロック後にファイル記述子に似ていない
select
関数が戻ると、私はaccept
関数を呼び出す後、それは-1を返し、その後、私はエラーEBADF
を返し、getsockopt
によってSO_ERROR
をチェックし、私は私のサーバソケットを扱うことができると言われます。
//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));
}
ログ:以下のコード
after accept error 5 -1 35 Resource temporarily unavailable
socket error: Bad file descriptor
私のテストデバイスはiPhone 4Sで、OSのバージョンは、iOS 8.4.1
私はすでにhttps://developer.apple.com/library/ios/documentation/NetworkingInternetWeb/Conceptual/NetworkingOverview/CommonPitfalls/CommonPitfalls.htmlを持っていると私は何も悪いことを発見していないです。
だから、なぜこれが起こり、解決するのですか?
あなたはリスニングソケット非ブロッキングを行ったすべての特定の理由は? selectを使用する場合、acceptを呼び出す前にacceptはブロックしません。 acceptから受け取ったエラーは実際のエラーではなく、受け入れられた接続がまだ準備されていないことを指摘し、listenしているソケットがノンブロッキングになっているだけです。これを阻止するリスニングソケットがほとんどなくなる可能性があります。 – alk