web-dev-qa-db-ja.com

TCP経由でのブロードキャストは可能ですか?

TCP接続でBSDソケットを使用するCでサーバー/クライアントシステムを作成しています。サーバーはマルチスレッドであり、各接続は独自の受容体で実行されます。各クライアントはサーバーと1対1で話し合うのは良いことですが、残念ながら、たとえば、クライアントAがすべてのクライアントにパケットを送信する必要があることを行った場合、SendToAll()関数を実装する方法を考えることはできません。 。どうすればよいですか?

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

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

15
Anthony

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

13
shf301

いいえ、ありません。たとえば、ウィンドウサイズの概念とその調整方法は、複数の関係者と話をしようとしている場合はまったく意味がありません。

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

いいえ、マルチキャストを実行するためのプロトコルは常に非常に特別な目的であり、目前の問題に焦点を当てる必要があると思います。一般化されたTCPのようなものは実現不可能です。

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

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

7
Omnifarious

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

2
Steve-o

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

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

1
tomlogic