2016-03-19 15 views
0

私のアプリケーションで何らかの理由で(クロスプラットフォームに関連する)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を持っていると私は何も悪いことを発見していないです。

だから、なぜこれが起こり、解決するのですか?

+0

あなたはリスニングソケット非ブロッキングを行ったすべての特定の理由は? selectを使用する場合、acceptを呼び出す前にacceptはブロックしません。 acceptから受け取ったエラーは実際のエラーではなく、受け入れられた接続がまだ準備されていないことを指摘し、listenしているソケットがノンブロッキングになっているだけです。これを阻止するリスニングソケットがほとんどなくなる可能性があります。 – alk

答えて

1

https://github.com/robbiehanson/CocoaHTTPServer/issues/10 同じ問題が発生しました。

アプリケーションは、UIApplicationWillResignActiveNotificationおよびUIApplicationWillEnterForegroundNotification通知を監視し、それに応じてサーバーを停止して再起動する必要があります。

のWebViewが別のポートからリソースをロードすることができなくなりますように、最初のサーバポートを維持することも重要である。「 」

+0

ありがとう@megar、私はそれを試してみましょう。 – llj098

関連する問題