9

Tôi muốn tạo Ứng dụng đóng gói Chrome chỉ được sử dụng cho mạng LAN, trong đó một phiên bản hoạt động dưới dạng máy chủ (máy chủ phiên) và các phiên bản khác phải khám phá máy chủ và tham gia phiên. Điều này có thể đạt được với chrome.socket không?Làm cách nào để chrome.socket có thể được sử dụng để phát sóng hoặc phát đa hướng?

Tôi đã thiết lập máy chủ như thế này:

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 
    ); 
}); 

Các ổ cắm bị ràng buộc, tôi có thể nhìn thấy nó trong ss -ua:

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

Nhưng các máy chủ không bao giờ dường như nhận được bất kỳ dữ liệu. Tôi đã cố gắng gửi một số dữ liệu sử dụng nc -uv 225.0.0.42 42424 và API chrome.socket nhưng không thành công:

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); 
    }); 
}); 

Điều này dẫn đến mã lỗi -15 về phía khách hàng và không có gì ở phía máy chủ.

Tôi nghi ngờ có một cờ đa hướng được đặt ở đâu đó nhưng tôi không thể tìm thấy nó.

Tôi đang sử dụng Chrome Version 23.0.1246.0 dev

+1

[Có thể liên kết này sẽ giúp bạn] (https://github.com/KensakuKOMATSU/chrome-upnp). –

+0

@Cicada Cảm ơn bạn đã liên kết. Tôi đã thêm 'socket.bind (socketId," 0.0.0.0 ", 0, function (res) {...})' trước dòng 'sendTo' và nó ngừng phàn nàn khi gửi dữ liệu. Thật không may, tôi vẫn không biết làm thế nào để ** nghe ** các gói multicast. – hlidka

Trả lời

3

Để gửi các gói tin multicast tất cả các bạn cần làm là liên kết với một giao diện địa phương (0.0.0.0 với một cổng ngẫu nhiên hoạt động, như bạn đã phát hiện ra), và sau đó địa chỉ một gói đến đúng nhóm/cổng (đó là những gì sendTo sẽ làm).

Để nhận dữ liệu đa hướng bạn cần cả hai liên kết với cổng chính xác (trên 0.0.0.0 là tốt), sau đó tham gia nhóm phát đa hướng chính xác. Bạn có thể làm bit đầu tiên với socket.bind, nhưng thứ hai thường được thực hiện với setsockopt và cờ IP_ADD_MEMBERSHIP. Rất tiếc, API ổ cắm Chrome không cung cấp quyền truy cập vào điều này.

Khi bạn thực hiện cuộc gọi này, hệ thống sẽ gửi một IGMP lên mạng hướng dẫn các bộ định tuyến chuyển tiếp các gói đa phương tiện cho một nhóm cụ thể đến giao diện của bạn, ràng buộc với đúng cổng là đủ để nhận chúng. Bạn thường có thể hướng dẫn hệ điều hành sao chép các gói multicast với giao diện loopback (vì vậy bạn có thể sử dụng multicast trên cùng một máy). Có thể bạn sẽ thấy rằng mã hiện tại của bạn sẽ hoạt động nếu các máy được kết nối trực tiếp với nhau, nhưng không nếu bạn kết nối thông qua một switch (vì nó sẽ thả các gói như bạn chưa đăng ký), và không nếu bạn đang ở trên cùng một máy (vì các gói không định tuyến qua giao diện loopback).

Giải pháp truyền thống cho việc này là tự tạo gói IGMP, cho phép phát đa hướng hoạt động thông qua một công tắc, chứ không phải trên máy cục bộ. Thật không may, điều này cần truy cập để gửi các gói IP thô (không phải TCP hoặc UDP) và chrome.socket không cung cấp.

Điều này có nghĩa là không có chương trình khác tham gia nhóm phát đa hướng thay cho bạn, bạn sẽ không thể nhận bất kỳ thứ gì.

+0

Tham gia/rời khỏi nhóm phát đa hướng hiện khả dụng trong API chrome.socket (cùng với khả năng yêu cầu lặp lại.) https://developer.chrome.com/apps/socket –

Các vấn đề liên quan