9

1つのインスタンスがサーバー(セッションホスト)として機能し、他のインスタンスがサーバーを検出してセッションに参加する必要がある、LAN専用のChromeパッケージアプリケーションを作成したいと考えています。これはchrome.socketで実現できますか?私はss -uaでそれを見ることができ、chrome.socketをブロードキャストまたはマルチキャストに使用するにはどうすればよいですか?

var socket = chrome.socket || chrome.experimental.socket; 
socket.create('udp', {}, function(createInfo) { 
    var publish_socket = createInfo.socketId; 
    socket.bind(publish_socket, '225.0.0.42', 42424, function (result) { 
     if (result < 0) console.error(result); // this works fine 
     socket.recvFrom(publish_socket, null, function(recvFromInfo) { 
      console.log(recvFromInfo); // UNABLE TO MAKE THIS HAPPEN 
     }); 
    }); 
    // Chrome won't let me listen for app window closing 
    var cleanup_timer; 
    cleanup_timer = setInterval(function(){ 
      if (requesting_window.closed) { 
       socket.destroy(publish_socket); 
       clearInterval(cleanup_timer); 
      } 
     }, 
     5000 
    ); 
}); 

ソケットがバインドされています:

私はこのようなサーバーを設定している

State  Recv-Q Send-Q  Local Address:Port   Peer Address:Port 
UNCONN  0  0   225.0.0.42:42424   *:* 

しかし、サーバーは、決して任意のデータを受信して​​いないようにみえます。私はnc -uv 225.0.0.42 42424を使用して、いくつかのデータとchrome.socketのAPIを送信しようとしたが、無成功しています

socket.create('udp', {}, function(socketInfo) { 
    var socketId = socketInfo.socketId; 
    socket.sendTo(socketId, str2ab("discovering"), '225.0.0.42', 42424, function(writeInfo) { 
     if (writeInfo.bytesWritten < 0) console.error(writeInfo); 
    }); 
}); 

これは、サーバー側でクライアント側と何にエラーコード-15になります。

どこかでマルチキャストフラグが設定されている必要がありますが、それを見つけることができませんでした。

私はあなたがする必要があるすべては(あなたが発見したようなランダムポートと0.0.0.0は、作品)ローカルインタフェースにバインドして、対処しているクロームバージョンマルチキャストパケットを送信するために23.0.1246.0 devの

+1

[多分このリンクはあなたを助けます](https://github.com/KensakuKOMATSU/chrome-upnp)。 –

+0

@Cicadaリンクをありがとう。 'sendTo'行の前に' socket.bind(socketId、 "0.0.0.0"、0、function(res){...}) 'を追加しました。残念ながら、私はマルチキャストパケットに**耳を傾ける**ことがまだ分かりません。 – hlidka

答えて

3

を使用しています正しいグループ/ポートへのパケット(これはsendToが行うものです)。

マルチキャストデータを受信するには、両方とも正しいポートにバインドする必要があります(0.0.0.0)。次に正しいマルチキャストグループに参加してください。 socket.bindで最初のビットを実行できますが、2番目のビットは通常setsockoptとフラグIP_ADD_MEMBERSHIPで行われます。残念ながら、ChromeソケットAPIではこれにアクセスできません。

このコールを実行すると、システムはIGMPをネットワークに送信して、特定のグループのマルチキャストパケットをインターフェイスに転送するようにルータに指示します。正しいポートにバインドすれば十分です。通常は、ループバックインターフェイスでマルチキャストパケットを複製するようにOSに指示することもできます(同じマシン上でマルチキャストを使用できるように)。おそらく、既存のコードはマシンが直接接続されていれば動作しますが、スイッチ経由で接続した場合は動作しません(購読していないパケットがドロップされるため)。同じマシン(パケットがループバックインターフェイス経由でルーティングされないため)

従来の解決策は、ローカルマシンではなくスイッチ経由でマルチキャストを動作させるIGMPパケットを自分で作成することでした。残念ながら、これは未処理のIPパケット(TCPまたはUDPではなく)を送信するためのアクセスを必要とし、chrome.socketはそれを提供しません。

これは、あなたの代わりにマルチキャストグループに参加する別のプログラムがなければ、何も受信できないことを意味します。

+0

マルチキャストグループへの参加/離脱は、chrome.socket APIで利用できるようになりました(ループバックを要求する機能とともに)。 https://developer.chrome.com/apps/socket –

関連する問題