クライアント側がソケットから読み取らない場合は、 でソケットを閉じる必要がありますclose
。また、クライアントがまだソケットに書き込みたい可能性があるためにそれを行いたくない場合は、少なくとも読み取り半分を で閉じる必要がありますshutdown(fd, SHUT_RD)
。
EPIPE
これにより、サーバーが書き込み呼び出しを取得するように設定されます。
クライアントを制御しない場合...作成していないランダムなクライアントが接続できる場合、サーバーは悪意のあるクライアントを積極的に処理する必要があります。クライアントが悪意のある方法の 1 つは、サーバーを強制的にハングさせようとすることです。これが起こらないようにするには、ノンブロッキング ソケットと説明したタイムアウト メカニズムを組み合わせて使用する必要があります。
一般に、サーバーとクライアントが通信する方法のプロトコルを作成して、相手側が読み取らないときにサーバーもクライアントもソケットに書き込もうとしないようにする必要があります。これは、それらを厳密に同期する必要があるという意味ではありません。しかし、たとえば、HTTP は、プロトコルの任意の時点で相手側が何かを書き込むことを本当に期待しているかどうかについて、どちらの側にも明確にわかるような方法で定義されています。