9

我想創建一個僅用於局域網的Chrome打包應用程序,其中一個實例充當服務器(會話主機),其他實例必須發現服務器並加入會話。這可以通過chrome.socket實現嗎?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   *:* 

但是服務器似乎從來沒有收到任何數據。我曾嘗試使用發送和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在客戶端並沒有什麼在服務器端。

我懷疑應該有一個多播標誌設置的地方,但我找不到它。

我使用的Chrome版本23.0.1246.0開發

+1

[也許這個鏈接可以幫助你(https://github.com/KensakuKOMATSU/chrome-upnp)。 –

+0

@Cicada感謝您的鏈接。我在'sendTo'行之前添加了'socket.bind(socketId,「0.0.0.0」,0,function(res){...})',並在發送數據時停止抱怨。不幸的是,我仍然不知道如何**多播包。 – hlidka

回答

3

要發送組播數據包,所有你需要做的是綁定到一個本地接口(0.0.0.0一個隨機端口工作,因爲你已經發現的),然後地址將數據包發送到正確的組/端口(這是sendTo將執行的操作)。

要接收你需要都結合到正確的端口的組播數據(上0.0.0.0是罰款),然後加入正確的組播組。你可以用socket.bind做第一位,但第二位通常用setsockopt和國旗IP_ADD_MEMBERSHIP完成。不幸的是,Chrome套接字API不提供對此的訪問。

當你做這個調用系統發送IGMP到網絡上的指示路由器到特定組播組的數據包轉發給您的界面,結合到正確的端口是那麼夠接收它們。您通常也可以指示操作系統使用回送接口複製組播數據包(這樣您就可以在同一臺機器上使用組播)。如果機器直接連接在一起,你可能會發現現有的代碼可以工作,但是如果你通過交換機連接(因爲它會丟棄你沒有訂閱的數據包),而不是如果你在同一臺機器(因爲數據包不通過回送接口進行路由)。

的傳統解決方案是創建一個自己的IGMP報文,這將允許組播通過開關的工作,而不是在本地計算機上。不幸的是,這需要訪問發送原始IP數據包(不是TCP或UDP),並且chrome.socket不提供。

這意味着,如果沒有其他程序來加入組播組,代表您,您將無法獲得任何東西。

+0

加入/離開多播組是現在chrome.socket API中提供(與請求回送的能力一起。) https://developer.chrome.com/apps/socket –