标签: multicast

为什么多播接收不适用于某些Android设备?

似乎多播接收在某些Android设备上不起作用.我无法通过13个测试设备中的4个接收多播.在这4个设备上,应用程序似乎不发送加入多播组的IGMP请求.

接收多播的代码如下所示:

WifiManager wifiManager = (WifiManager)context.getSystemService(Context.WIFI_SERVICE);
WifiManager.WifiLock wifiLock = wifiManager.createWifiLock(WifiManager.WIFI_MODE_FULL_HIGH_PERF, TAG);
WifiManager.MulticastLock multicastLock = wifiManager.createMulticastLock(TAG);
multicastLock.setReferenceCounted(true);

wifiLock.acquire();
multicastLock.acquire();

try {
    MulticastSocket socket = new MulticastSocket(32123);

    InetAddress group = InetAddress.getByName("224.1.2.3");
    socket.joinGroup(group);

    DatagramPacket packet;
    byte[] buf = new byte[256];
    packet = new DatagramPacket(buf, buf.length);

    socket.receive(packet);

    socket.leaveGroup(group);
    socket.close();
} catch (IOException e) {
    e.printStackTrace();
}

multicastLock.release();
wifiLock.release();
Run Code Online (Sandbox Code Playgroud)

该应用具有以下权限:

<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE"/>
<uses-permission android:name="android.permission.CHANGE_WIFI_MULTICAST_STATE"/>
Run Code Online (Sandbox Code Playgroud)

为了演示这个问题,我在GitHub:MulticastTest上使用上面的代码创建了一个小测试项目.

我的代码有问题吗?我错过了许可吗?

编辑1:此问题似乎与特定的Android版本无关.我可以在Android 4.x,5.x和6.x上重现这种行为.

编辑2:有一个相关的问题.

networking android multicast igmp android-networking

10
推荐指数
1
解决办法
3838
查看次数

UDP服务器发现 - 客户端应该发送多播以查找服务器还是服务器应该发送常规信标?

我的客户端需要连接到单个服务器进程.我正在使用UDP发现为客户端找到服务器.我有客户端和服务器交换IP地址和端口号,以便在完成发现后建立TCP/IP连接.这样,数据包大小保持很小.我看到这可以使用UDP以两种方式之一完成:

  1. 每个客户端发出自己的多播消息以搜索服务器,然后服务器响应该服务器.客户端可以定期重复发送此多播消息(在服务器关闭的情况下),直到服务器响应.
  2. 服务器定期发送多播消息信标.客户端订阅多播组,并以这种方式接收服务器的多播消息并完成发现.

在1.如果有许多客户端,那么最初将传输许多多播消息(每个客户端一个).只有服务器才会订阅并从客户端接收多播消息.一旦服务器响应客户端,客户端就不再发送多播消息.一旦所有客户端完成了对服务器的发现,就不会在网络上传输进一步的多播消息.但是,如果服务器关闭,则每个客户端将间隔发送多播消息信标,直到服务器备份并且可以响应.

在2.只有服务器会定期提交多播消息信标.此消息最终将路由到订阅多播组的所有客户端.客户端收到数据包后,客户端的UDP侦听套接字将关闭,并且不再订阅多播组.但是,服务器必须继续发送多播信标,以便新客户端可以发现它.它将继续定期发送信标,无论是否有任何客户端需要发现它们.

所以,无论如何,我都看到了利弊.在我看来,#1最初会导致更重的负载,但这个负载最终会降低到零.在#2中,服务器将继续永远发送信标.

UDP和多播对我来说是一个相当新的话题,所以我有兴趣找出哪种方法是首选方法,哪些方法可以减少网络负载.

sockets udp multicast discovery

9
推荐指数
1
解决办法
8067
查看次数

chrome.socket如何用于广播或多播?

我想创建一个仅用于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
    );
});
Run Code Online (Sandbox Code Playgroud)

套接字是绑定的,我可以在ss -ua:

State      Recv-Q Send-Q      Local Address:Port …
Run Code Online (Sandbox Code Playgroud)

javascript multicast multiplayer broadcast google-chrome-extension

9
推荐指数
1
解决办法
4871
查看次数

boost :: asio组播示例

我刚刚开始使用boost :: asio读取有关多播传输的信息,我对以下内容感到有些困惑:

为什么我们需要在下面的boost :: asio示例中使用"监听地址"?那是什么意思?为什么选择与localhost不同的东西?

http://www.boost.org/doc/libs/1_37_0/doc/html/boost_asio/example/multicast/receiver.cpp

c++ sockets boost multicast boost-asio

9
推荐指数
2
解决办法
3877
查看次数

IPPROTO_RM在接受呼叫期间阻止

这个问题类似于/sf/ask/815522991/,但我的代码与它略有不同,因此可能会导致在一个不同的答案.

我试图获得可靠的多播服务器/客户端概念验证设置.

解决方案本身是服务器/客户端连接.客户端通过TCP/IP连接到服务器.然后,服务器打开一个可靠的多播套接字供客户端监听.客户端通过TCP发送消息,服务器通过TCP回送消息IPPROTO_RM.最终目标是让许多客户端连接到服务器,所有客户端都接收每个回显的消息.

示例代码基于此页面.

我已经设置了类似的RM套接字(参见下面的清单).TCP套接字工作正常.问题在于RM套接字.服务器开启了组播插座,然后bindsconnects多播地址正确.然而,客户端是listens正确的,但accept永远是对块的调用.

客户端和服务器进程都在同一主机上运行.

我已经检查过,主机上安装了多播支持(Server 2008).


更新:我注意到,如果我先从发送方侧向套接字发送一些数据,有时接受将返回.这不是理想的,也不可靠.

更新:标志指向开关.看起来像一个小集线器不会削减它.我们发生了一个搞笑的事件,导致整栋大楼失去了通讯.


房源

服务器创建并连接多播发送方

short
   Port = 0;
const char
   *Address = "234.5.6.7";

SOCKET
   RMSocket;

SOCKADDR_IN 
   LocalAddr, 
   SessionAddr;

RMSocket = socket(AF_INET, SOCK_RDM, IPPROTO_RM);


if (RMSocket == INVALID_SOCKET)
   {
   return Failed;
   }

LocalAddr.sin_family = AF_INET;
LocalAddr.sin_port = htons(0);
LocalAddr.sin_addr.s_addr = htonl(INADDR_ANY);

if ( bind( RMSocket, (SOCKADDR*)&LocalAddr, sizeof(LocalAddr)) == SOCKET_ERROR )
   {
   return Failed;
   }

SessionAddr.sin_family …
Run Code Online (Sandbox Code Playgroud)

c multicast winsock2 reliable-multicast

9
推荐指数
1
解决办法
299
查看次数

列出多播套接字

我想在linux系统上列出所有打开的多播套接字?netstat -g列出了已加入的组.为此可以使用其他任何实用工具吗?

非常感谢您的帮助.

sockets linux netstat multicast

9
推荐指数
2
解决办法
3万
查看次数

UDP广播/多播与单播行为(丢弃的数据包)

我有一个嵌入式设备(源),它通过UDP数据包以20毫秒(=约330字节)的块发送(音频)数据流.因此,网络容量相当低,约为16kBps(实际上由于UDP/IP开销而略多).设备运行lwIP堆栈(v1.3.2)并使用H&D Wireless的WiFi解决方案(HDG104,WiFi G模式)连接到WiFi网络.目的地(接收器)是Windows Vista PC,它也使用USB WiFi加密狗(WiFi G模式)连接到WiFi网络.PC上运行的程序允许我监视丢弃的数据包的数量.我也在运行Wireshark来直接分析网络流量.此时,没有其他客户端通过网络主动发送数据.

当我使用广播或多播发送数据时,许多数据包被丢弃,有时高达15%.但是,当我切换到使用UDP单播时,丢弃的数据包数量可以忽略不计(<2%).

使用UDP我希望丢弃数据包(在我的音频应用程序中这是正常的),但为什么我看到广播/多播和单播之间的性能有如此大的差异?

我的路由器是WRT54GS(FW v7.50.2),PC(接收器)使用的是Trendnet TEW-648UB网络适配器,在WiFi G模式下运行.

udp multicast broadcast lwip

9
推荐指数
1
解决办法
2万
查看次数

WebRTC多播(一对多)

嗨,我对WebRTC有疑问.

我想创建与MCU服务器的一对多(1:N)连接(因为来自源的流太大(CPU,带宽...)),但我不知道我该怎么做,存在一些项目为此?我发现只有EasyRTC,Licode等,但我想这只适用于视频会议(多对多).非常感谢你

multicast webrtc

9
推荐指数
1
解决办法
2万
查看次数

100%无服务器(分散)对等点发现的可能解决方案?

我一直在考虑一个真正的100%无服务器系统如何工作.具体而言,我对同行发现很感兴趣.似乎这是将当前分散系统实际分散的唯一部分.

据我所知,没有100%无服务器系统.例如,甚至种子也需要连接到跟踪器或DHT路由器(router.bittorrent.com)等集中式网络来发现其同行.

我首先想到的是互联网广播.简单的说,

  1. 客户端向世界广播其标识(例如IP地址)信标
  2. 另一个客户端收到该信标
  3. 两个客户端相互连接.
  4. 如果连接的客户端越多,它们就形成了紧密的网络.

但是,这可能非常低效(255*255*255*255*64字节= 270GB /信标)并且不受支持.就目前而言,这是我能想到的唯一解决方案.搜索了几个小时后,唯一的解决方案就是"只使用部分集中的服务器".

对于100%无服务器的对等点发现,是否有任何解决方案(甚至是理论上的)?

networking multicast broadcast

9
推荐指数
0
解决办法
1500
查看次数

C#UDP客户端读取组播IP(本地接口),并向VPN发送单播UDP

我有一个VPN客户端,可以通过VPN管道发送单播UDP数据包,但不支持多播IP(UDP)数据包(OpenVPN).所以我想我可以编写这个带有IP(端口3000)多播的小垫片,并通过VPN作为单播发送它们.

我看到组播数据包到了,但我看不到任何东西到达VPN端(WireShark没有帮助,因为不像IpConfig/all)它没有看到VPN接口.).

我认为我的问题可能是我不清楚BIND和CONNECT之间的区别,以及我应该将UDPClient绑定到哪个接口(vpn或local).

命令行是:

239.0.0.0 198.168.0.15 10.4.30.239 172.27.225.77
arg[0] = multicast from address
arg[1] = unicast to address
arg[2] = local physical ethernet assigned address
arg[3] = virtual address of computer on VPN network (client)
Run Code Online (Sandbox Code Playgroud)
using System;
using System.Collections.Generic;
using System.Net;
using System.Net.Sockets;
using System.Threading.Tasks;

namespace MUTunnel
{
    public class EchoBot
    {
        protected UdpClient sender;
        protected UdpClient listener;

        protected const int listenPort = 3000;
        protected const int outPort = 3000;

        protected IPEndPoint inPoint;
        protected IPEndPoint outPoint;
        protected IPAddress listenAddress;
        protected …
Run Code Online (Sandbox Code Playgroud)

c# multicast udpclient windows-networking

9
推荐指数
1
解决办法
790
查看次数