16

TCP 接続で BSD ソケットを使用するサーバー/クライアント システムを C で作成しています。サーバーはマルチスレッド化されており、各接続は独自の受容体で実行されます。各クライアントはサーバーと 1 対 1 でうまくやり取りしますが、悲しいことに SendToAll() 関数を実装する方法が思いつきません。すべてのクライアント。どうすればいいですか?

すべてのレセプタにキューを実装することを検討していましたが、ブロードキャストはそれらのキューに送信されます。受容体が新しいパケットを送信するとき、意味がある場合は、そのメッセージもパケットに追加します。

しかし、ええ、UDP 経由でできるように、TCP 経由でブロードキャストする方法はありますか?

4

4 に答える 4

15

誰もがTCPでは不可能だと言っているように、それはユニキャストのみです. ただし、TCP の信頼性を備えたマルチキャストを提供する信頼できるマルチキャストの実装があります。wikipedia、特にPragmatic General Multicastを参照してください。

于 2010-11-28T03:56:53.193 に答える
8

いいえ、ありません。たとえば、複数の相手と話そうとすると、ウィンドウ サイズの概念とその調整方法はまったく意味がなくなります。

マルチキャストを許可しながら、TCP の多くの属性を共有する新しいプロトコルを作成できる可能性があります。しかし、それは非常に問題があると思います。たとえば、受信者がデータを受信する速度は、最も遅い受信者の制限によって制限されます。送信側は、最も遅い受信側でも必要に応じて再送信できるように、バッファ スペースを管理する必要があります。

いいえ、マルチキャストを行うためのプロトコルは常に非常に特殊な目的を持ち、目前の問題に焦点を合わせたものでなければならないと思います。一般化された TCP のようなものは実現不可能です。

信頼性の高いマルチキャスト バルク データ転送を行う方法があります。基本的な考え方は、消去コードを使用して、一種のループで情報を継続的に送信することです。その後、受信者は、元のファイルを再構築するのに十分な量になるまで、パケットの受信を開始できます。

しかし、これらはあなたのシナリオにうまく適合していないようです。

于 2010-11-28T03:32:34.463 に答える
2

オーバーレイネットワークを検討するか、BSDソケットAPIも便利に提供するØMQなどの公開セマンティクスを提供するメッセージングミドルウェアを使用することを検討してください。

于 2010-11-28T04:34:56.677 に答える
2

開いSendToAll()ているすべてのソケットを繰り返し処理し、それぞれに個別にデータを書き込む必要があります。

ブロードキャストとマルチキャストは、UDP ソケットのみに制限されています。

于 2010-11-28T03:50:51.393 に答える