最初に、モチベーションを説明する少しの背景:私は非常に単純なselect()ベースのTCP "ミラープロキシ"に取り組んでいます。これは、2つのファイアウォールクライアントが互いに間接的に会話できるようにします。両方のクライアントがこのサーバーに接続し、両方のクライアントが接続されるとすぐに、クライアントAによってサーバーに送信されたTCPバイトがクライアントBに転送されます。TCPソケットがリモートピアによって読み込まれずに閉じられたことを検出する方法はありますか?
クライアントAがサーバに接続してクライアントBが接続する前にデータの送信を開始すると、サーバはデータを置く場所がありません。私はそれがRAMの多くを使用して終了する可能性があるので、それをRAMにバッファリングしたくない。クライアントBが必要とするかもしれないので、データをドロップするだけではいけません。だから私は、クライアントBが接続されるまで、クライアントAのソケットでselect() - for-read-readyを選択しないという3番目のオプションに行きます。そうすれば、クライアントAはすべての準備が整うまでブロックします。
クライアントAのソケットで読み取り準備ができていないという副作用は、クライアントAがサーバーへのTCP接続を閉じることを決定した場合、サーバーに通知されませんその事実について - 少なくとも、クライアントBが来て、クライアントAのソケットで読み込み準備を選択し、保留中のデータを読み込んだ後、ソケットクローズされた通知(すなわちrecv()が0を返す) )。
クライアントAが自分のTCP接続を閉じたときに、サーバーが何らかの方法で(適時に)知っていれば、私はそれを好むでしょう。これを知る方法はありますか?この場合、ポーリングは受け入れられます(たとえばselect()を1分に1回起きて、そのような関数が存在する場合はすべてのソケットでIsSocketStillConnected(sock)を呼び出します)。
あなたは検討する必要があります[この質問](のhttp://のstackoverflow。com/q/16320039/315052)。 – jxh