似乎多播接收在某些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:有一个相关的问题.
我的客户端需要连接到单个服务器进程.我正在使用UDP发现为客户端找到服务器.我有客户端和服务器交换IP地址和端口号,以便在完成发现后建立TCP/IP连接.这样,数据包大小保持很小.我看到这可以使用UDP以两种方式之一完成:
在1.如果有许多客户端,那么最初将传输许多多播消息(每个客户端一个).只有服务器才会订阅并从客户端接收多播消息.一旦服务器响应客户端,客户端就不再发送多播消息.一旦所有客户端完成了对服务器的发现,就不会在网络上传输进一步的多播消息.但是,如果服务器关闭,则每个客户端将间隔发送多播消息信标,直到服务器备份并且可以响应.
在2.只有服务器会定期提交多播消息信标.此消息最终将路由到订阅多播组的所有客户端.客户端收到数据包后,客户端的UDP侦听套接字将关闭,并且不再订阅多播组.但是,服务器必须继续发送多播信标,以便新客户端可以发现它.它将继续定期发送信标,无论是否有任何客户端需要发现它们.
所以,无论如何,我都看到了利弊.在我看来,#1最初会导致更重的负载,但这个负载最终会降低到零.在#2中,服务器将继续永远发送信标.
UDP和多播对我来说是一个相当新的话题,所以我有兴趣找出哪种方法是首选方法,哪些方法可以减少网络负载.
我想创建一个仅用于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
我刚刚开始使用boost :: asio读取有关多播传输的信息,我对以下内容感到有些困惑:
为什么我们需要在下面的boost :: asio示例中使用"监听地址"?那是什么意思?为什么选择与localhost不同的东西?
http://www.boost.org/doc/libs/1_37_0/doc/html/boost_asio/example/multicast/receiver.cpp
这个问题类似于/sf/ask/815522991/,但我的代码与它略有不同,因此可能会导致在一个不同的答案.
我试图获得可靠的多播服务器/客户端概念验证设置.
解决方案本身是服务器/客户端连接.客户端通过TCP/IP连接到服务器.然后,服务器打开一个可靠的多播套接字供客户端监听.客户端通过TCP发送消息,服务器通过TCP回送消息IPPROTO_RM.最终目标是让许多客户端连接到服务器,所有客户端都接收每个回显的消息.
示例代码基于此页面.
我已经设置了类似的RM套接字(参见下面的清单).TCP套接字工作正常.问题在于RM套接字.服务器开启了组播插座,然后binds和connects多播地址正确.然而,客户端是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) 我想在linux系统上列出所有打开的多播套接字?netstat -g列出了已加入的组.为此可以使用其他任何实用工具吗?
非常感谢您的帮助.
我有一个嵌入式设备(源),它通过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模式下运行.
嗨,我对WebRTC有疑问.
我想创建与MCU服务器的一对多(1:N)连接(因为来自源的流太大(CPU,带宽...)),但我不知道我该怎么做,存在一些项目为此?我发现只有EasyRTC,Licode等,但我想这只适用于视频会议(多对多).非常感谢你
我一直在考虑一个真正的100%无服务器系统如何工作.具体而言,我对同行发现很感兴趣.似乎这是将当前分散系统实际分散的唯一部分.
据我所知,没有100%无服务器系统.例如,甚至种子也需要连接到跟踪器或DHT路由器(router.bittorrent.com)等集中式网络来发现其同行.
我首先想到的是互联网广播.简单的说,
但是,这可能非常低效(255*255*255*255*64字节= 270GB /信标)并且不受支持.就目前而言,这是我能想到的唯一解决方案.搜索了几个小时后,唯一的解决方案就是"只使用部分集中的服务器".
对于100%无服务器的对等点发现,是否有任何解决方案(甚至是理论上的)?
我有一个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)