3

NSStream を使用して接続するクライアント - サーバー アプリがあります。接続を開こうとすると、最初にメッセージを送信しようとしたときに、接続の一方が NSStreamEventEndEncountered を取得することがあります。

CFStream と NSStream の間のブリッジを使用します。私のサーバーはソケットを作成します:

_ipv4cfsock = CFSocketCreate(kCFAllocatorDefault,PF_INET, SOCK_STREAM,IPPROTO_TCP, kCFSocketAcceptCallBack, handleConnect, &info);

handleConnect コールバック関数でCFStreamCreatePairWithSocketは、2 つの CFStream を取得するために使用されます。

私のクライアントはCFStreamCreatePairWithSocketToHost、ホストに接続するために使用します。

クライアントは接続 (NSStream を作成) し、ping を送信します。私のサーバーは接続を受信すると NSStream を開き、ping を受信するとポンを送信します。

kCFStreamPropertyShouldCloseNativeSocket接続の1つが閉じると、ストリームでtrueに設定したため、もう1つはNSStreanEventEndEncounteredを取得する必要があります。

いくつかの異なる結果が得られました。何が起こっているのかを確認するために NSLog を使用しました。

-ほとんどの場合、接続が開き、期待どおりに機能します。

Server did recieve new connection
Server recieved ping
Server Sent pong
Client recieved pong

-ポンを送信しようとすると、接続が閉じます (NSStreamEventEndEncountered)。クライアントは pong を受信しませんが、NSStreamEventEndEncountered を受信します

Server did recieve new connection
Server recieved ping
Server recieved pong
Server closed
Client closed

- ping を送信しようとすると、接続が閉じます (NSStreamEventEndEncountered)。サーバーが ping または NSStreamEventEndEncountered を受信しない

Server did recieve new connection
Client closed

-ping を送信しようとしたときにエラーが発生しました:

Server did recieve new connection;
Error recieved: The operation couldn’t be completed. Connection reset by peer

クライアントとサーバーの両方が私のコンピューターにあります。書き込もうとすると、ストリームが NSStreamEventEndEncountered を取得するのはなぜですか?

4

1 に答える 1

7

問題が見つかりました。接続が開くとすぐに送信されたバッファがありました。このバッファにデータがなかった場合、ストリームの終了シグナルである空のバッファが送信されました。

Apple Docから:

接続の反対側が接続を閉じた場合:

接続デリゲートの stream:handleEvent: メソッドは、streamEvent を NSStreamEventHasBytesAvailable に設定して呼び出されます。そのストリームから読み取ると、ゼロ (0) の長さを取得します。

接続デリゲートの stream:handleEvent: メソッドは、streamEvent を NSStreamEventEndEncountered に設定して呼び出されます。

これら 2 つのイベントのいずれかが発生すると、デリゲート メソッドは、ファイルの終わりの状態を検出し、クリーンアップする役割を果たします。

于 2014-06-12T22:06:14.240 に答える