9

1 つのインスタンスがサーバー (セッション ホスト) として機能し、他のインスタンスがサーバーを検出してセッションに参加する必要がある、LAN 専用の Chrome パッケージ アプリを作成したいと考えています。これは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
    );
});

ソケットがバインドされています。次のように表示されss -uaます。

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

しかし、サーバーはデータを受信して​​いないようです。と chrome.socket API を使用していくつかのデータを送信しようnc -uv 225.0.0.42 42424としましたが、成功しませんでした:

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し、サーバー側では何も発生しません。

どこかにマルチキャストフラグが設定されているはずですが、見つかりませんでした。

Chrome バージョン 23.0.1246.0 dev を使用しています

4

1 に答える 1

4

マルチキャスト パケットを送信するには、ローカル インターフェイスにバインドし (0.0.0.0ランダム ポートが機能することがわかりました)、パケットを正しいグループ/ポートにアドレス指定するだけです (これが実行されsendToます)。

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

この呼び出しを行うと、システムはネットワークに IGMP を送信し、特定のグループのマルチキャスト パケットをインターフェイスに転送するようにルーターに指示します。正しいポートにバインドするだけで受信できます。通常、OS にループバック インターフェイスを使用してマルチキャスト パケットを複製するように指示することもできます (同じマシンでマルチキャストを使用できるようにするため)。マシンが直接接続されている場合は既存のコードが機能することがわかるでしょうが、スイッチを介して接続している場合は機能しません (サブスクライブしていないため、パケットがドロップされるため)。同じマシン (パケットはループバック インターフェイス経由でルーティングされないため)。

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

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

于 2012-09-10T07:43:12.467 に答える