接続を閉じずread
に、ソケットからの戻り値をゼロに強制する必要があります。
私は次のようなページのステートメントを読みました。
ファイルの終わりの条件を受け取った場合、または接続が閉じられた場合は、0が返されます。
しかし、送信した文字列の後にその条件を受信させる方法がわかりません。
誰か助けてもらえますか?
私はあなたがそれをすることができないことを恐れています。
ゼロを返したい場合はread
、ソケットを閉じる必要があります。ソケットを閉じたくない場合は、プロトコルの一部として「通信の終わり」または「メッセージの終わり」を通知する必要があります。
これを行う一般的な方法は、各メッセージにその長さをプレフィックスとして付けることです。そうすれば、受信側はいつ完全なメッセージを読んだかを知り、それを使って何でもしたいことをします。
ピアの read() または recv() がゼロを返すようにするには、ソケットを閉じるか、出力のためにシャットダウンする必要があります。いずれの場合も、その後は何も送信できません。その制約が適切でない場合は、意味がないため、要件を修正する必要があります。
「ファイル終了状態」と「接続クローズ」状態の両方が、このソケットでこれ以上データを受信できないことを受信者に伝えます。魔法のデータを送信してそれをシミュレートすることはできません。
ソケットで呼び出す以外にclose
、ソケットで使用shutdown(2)
して、読み取り側または書き込み側のみを閉じることができます。これは、限られたケースでは役立つかもしれませんが、一般的なケースでは役に立ちません。
おそらく、 poll(2)のような多重化システムコールが必要です。
Advanced Linux ProgrammingやAdvanced Unix Programmingなどの優れた資料を読む必要があることは間違いありません。
アプリケーション メッセージを転送するために TCP/IP 転送が必要な場合は、(固定サイズのメッセージを使用するか、転送中に論理メッセージ サイズを知る方法を用意することによって) 自分でパッケージ化とフラグメント化を明示的に行う必要があります。TCP/IP 伝送は、ネットワークによって断片化される可能性があることに注意してください。