FIFOはリーダーとライターの両方を開く必要があるため、使用上の問題があります。一方が遅れている場合、もう一方はオペレーティングシステム内でブロックされます。
公開メカニズムを実装する必要があります。プログラムはログを投稿し、誰かがリスニングに「関心」すると(たとえば、公開チャンネルを開くと)メッセージを受け取ります。誰も「関心」しないと、メッセージは消えます。問題ありません。 1つ以上のリスナーをサポートしていません。問題ありません。何が使えますか?
ベストアンサー1
UDPをブロードキャストできます。これは送信者セクションに何でもパイプしてください。
socat - UDP-DATAGRAM:127.255.255.255:50011,sourceport=50022,broadcast
受話器この機能により、いつでもパーティーに参加したり、パーティーから出ることができます。
socat - UDP-LISTEN:50011,bind=127.255.255.255,sourceport=50022,reuseaddr
注と説明:
- UDPはパケットが順番に到着することを保証しません(参照:これ)
50011
50022
選択したポート番号です。- このアドレスは
127.255.255.255
ループバックインターフェイスを介してブロードキャストする送信者を表し、必要に応じてLAN内でブロードキャストするように調整できます。 - 繰り返しますが、
bind=127.255.255.255
他の場所から来る(存在する場合)UDPパケットを心配する必要がないように、受信機はこのインターフェイスに制限する必要があります。 - 固定する理由は2つあります
sourceport
。- 受信者は、異なる(おそらくランダムな)送信元ポートから同じアドレスとポートにブロードキャストしている別の(悪意のある)送信者を「見ない」ことがあります。
- 何らかの理由で発信者がシャットダウンした後、それを再開することができ、発信者が任意の送信元ポートを使用している場合、既存の受信者は固定されたままになるため、通常は新しい送信側を「見る」ことができません。前のソースポートに移動します。
reuseaddr
複数の受信機が共存できます。reuseaddr
技術的には、複数の送信者を実行できる送信者セクションに追加できます。これにより、受信側でインターリーブされた出力が発生する可能性があるため、お勧めできません。- 実行中の送信者は、まったく同じアドレスとポートタプルを使用して他の(悪意のある)送信者をブロックします。ただし、荷送人が終了すると、他の荷送人が代用することができます。ルートアクセス権がある場合は、
sourceport
以下から選択できます1024
。ほとんどのオペレーティングシステムでは、通常のユーザーがこれらのポート(「特権ポート」と呼ばれる)にバインドすることを許可していないため、送信者が死んでいてもユーザーを偽装することはできません。ただし、一般ユーザーが実行しているリスナーは特権ポートをとして使用できますsourceport
。ルートのみを受信できるようにするには、別のポート(50011
例では)を特権ポートに変更します。