2010-11-28 11 views
14

私はCでサーバ/クライアントシステムを書いています。これはTCP接続の下でBSDソケットを使います。サーバーはマルチスレッドであり、各接続はそれ自身のレセプターで実行されます。悲しいことに、クライアントAがパケットを送る必要がある何かをする場合、SendToAll()関数を実装する方法を考えることができません。すべてのクライアント。どうすればいい?TCP経由のブロードキャストは可能ですか?

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

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

+1

...どのようにACKパケットを受信しますか? –

答えて

7

いいえ、ありません。たとえば、ウィンドウサイズの概念とそれがどのように調整されているかは、複数の当事者と対話しようとすると完全に無意味になります。

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

いいえ、私はマルチキャストを行うためのプロトコルは常に非常に特殊な目的でなければならず、正確な問題に集中していると思います。一般化され、TCPのようなものは実現できません。

信頼できるマルチキャストバルクデータ転送を行う方法があります。基本的な考え方は、一種のループで情報を連続的に送信するためにerasure codesを使用することです。受信者は元のファイルを再構成するのに十分なまでパケットの受信を開始するだけです。

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

+2

[既存のまたは提案された信頼できるマルチキャストプロトコル](http://en.wikipedia.org/wiki/Reliable_multicast#Existing_or_proposed_protocols) – dreamlax

+1

@dreamlax - 興味深い。私は、信頼できるマルチキャストバルクデータ転送のアイディアについて知っています。これには消去コードを使用し、ループで再送信するだけです。こうすることで、受信者は途中で物事を取り上げ、ファイル全体を再構築するのに十分なデータが得られるまで受信を続けることができます。 – Omnifarious

0

あなたのSendToAll()はすべての開いているソケットを通して反復し、それぞれ独立してデータを書き込む必要があります。

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

+3

これはあまり真実ではありません。マルチキャストとブロードキャストを可能にする他のプロトコルがあります。たとえば、[PGM](http://en.wikipedia.org/wiki/Pragmatic_General_Multicast)があります。 – dreamlax

10

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

2

overlay networksを参照するか、ØMQなどのパブリッシュのセマンティクスを提供するメッセージングミドルウェアを使用することを検討すると便利です。これも便利にBSDソケットAPIを提供します。

関連する問題