作为这个问题的后续问题,我已经在我的本地机器上运行了一个解决方案,但是没有在网络上的机器上运行.
我不太了解那些基础知识以外的插座,所以请耐心等待.目标是让客户端在本地网络上查找服务器,这是一些剪切/粘贴/编辑代码的结果.
这是客户端代码:
IPEndPoint ipep = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 10294);
    byte[] data = new byte[1024];
    public Form1()
    {
        InitializeComponent();
    }
    private void button1_Click(object sender, EventArgs e)
    {
        Socket client = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
        client.SetSocketOption(SocketOptionLevel.IP, SocketOptionName.MulticastTimeToLive, 10);
        string welcome = "What's your IP?";
        data = Encoding.ASCII.GetBytes(welcome);
        client.SendTo(data, data.Length, SocketFlags.None, ipep);
        IPEndPoint server = new IPEndPoint(IPAddress.Any, 0);
        EndPoint tmpRemote = (EndPoint)server;
        data = new byte[1024];
        int recv = client.ReceiveFrom(data, ref tmpRemote);
        this.IP.Text = ((IPEndPoint)tmpRemote).Address.ToString(); //set textbox
        this.Port.Text = …在Java世界中,可靠多播的现代方法是什么?
在网上搜索,我想出了JGroups和JRMS.JGroups在我的情况下似乎有些过分(我希望有一组相同的节点,这些节点通过一起协作并通过通知每个现有节点来加入这个组).JRMS看起来已经死了.
我无法找到任何针对Java的PGM协议的特定实现.
我一直在集思广益一个webapp的想法,比如Turntable.fm,但是对于局域网来说,同样地,SAME网络上的所有计算机都不是同时下载一首歌(杀死带宽)而是流式传输音乐.基本功能是用于"主"PC(带扬声器的PC)播放本地歌曲或通过LAN接收歌曲然后播放它们.
我的问题是,HTML5页面(在线托管)是否有办法使用JS检测局域网用户并直接相互通信而无需任何中央服务器?举例说明:
Office LAN has 2 users, Bob and Bill
Bob enters lanmusic.com
Bill enters lanmusic.com
Internet dies, LAN is fine.
Bob can still detect via the page that local user Bill is on the page too
Bill sends a song to Bob through the page directly
Bob plays song with page's javascript music player
所以关键点:
我只是好奇.这是一个API错误吗?加入组播组时,不要使用端口,只使用组播组(IP)作为组播组,对吗?
这是一个令人烦恼的情况,是否会使用PORT?
我有几台嵌入式计算机正在监听并将rtp音频数据流式传输到多播组.它们连接到智能管理交换机(Netgear GS108Ev2),它在其端口上执行基本的igmp监听和多播过滤,因此我的(W)LAN的其余部分不会被淹没.
开始时一切正常,大约500-520秒.之后,他们在离开并再次加入该组之前不会再收到任何数据.我想交换机在超时后"忘记"加入了.
有没有办法刷新组成员资格,即让交换机知道,还有人在监听,而不会丢失数据包?
系统信息:
Arch: blackfin
# cat /proc/version
Linux version 2.6.28.10-ADI-2009R1-uCBF54x-EMM
(gcc version 4.3.3 (ADI) ) #158 PREEMPT Tue Jun 5 20:05:42 CEST 2012
当我创建两个udp套接字并将它们绑定到INADDR_ANY和相同的端口号时.但其中一人加入了一个组播组.但是它们都可以从同一个组播组接收数据,即使其中一个套接字没有加入组播组.
这是一些用于设置多播接收器的Python代码.它在mac和linux上运行良好.
import socket, struct
ADDR='239.239.250.1'
PORT=8001
sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
sock.bind((ADDR, PORT))
mreq = struct.pack("4sl", socket.inet_aton(ADDR), socket.INADDR_ANY)
sock.setsockopt(socket.IPPROTO_IP, socket.IP_ADD_MEMBERSHIP, mreq)
但在Windows上运行时在绑定上收到错误10049.
Z:\winx>c:\Python27\python.exe q2.py
Traceback (most recent call last):
  File "q2.py", line 11, in <module>
    sock.bind((ADDR,PORT))
  File "c:\Python27\lib\socket.py", line 224, in meth
    return getattr(self._sock,name)(*args)
socket.error: [Errno 10049] The requested address is not valid in its context
Windows多播是否存在已知问题?如果没有,我可以采取哪些步骤进行诊断?
我正在创建一个应用程序,其中存在某个线程(MulticastListenerThread),该线程具有MulticastSocket并且正在侦听发送到套接字正在侦听的多播组的UDP(数据报)数据包.
这有效.我可以加入多播组,向该组发送消息并通过MulticastSocket接收它.
但是,我想从接收器的角度确定他收到的数据包组播组.以下代码为我提供了数据包发起者的地址,而不是多播组:
DatagramPacket packet = new DatagramPacket(buf, buf.length);
mlcSenderSocket.receive(packet);
String src_addr = packet.getAddress().getHostAddress();
发送数据包的代码如下:
InetAddress address = InetAddress.getByName(dest);
packet = new DatagramPacket(payload, payload.length,
    address, mlcEventPort);
LLog.out(this,"[NC] MLC packet Sent to ev port MLC " + mlcEventPort
    + " and to addr " + address);
mlcSenderSocket.send(packet);
是否可以确定哪个组发送了数据包?
编辑:
看来这是不可能的.在性能影响方面(我正在为IoT设备工作),为每个多播组分配一个套接字(因此,每个组的一个监听器线程)是否可行?可能会加入许多群体(数十或数百甚至).如果它是可行的,那么我只需要手动将连接的组地址保留在某处并在必要时引用它.欢迎对其他工作的建议!
我的Winsock Delphi应用程序应该在所有网络接口上侦听多播UDP/IP流.它正常收听,直到我在具有不同网络适配器优先级顺序的另一台PC上尝试它.
然后我开始研究问题,并在一些论坛上发现INADDR_ANY(或0.0.0.0)在Windows和Linux中有不同的含义:
0.0.0.1第二个).引用:"如果此成员指定IPv4地址为0.0.0.0,则使用默认的IPv4多播接口" - 不提及是用于侦听还是用于发送.你能否证实或否认这一点?
如何在所有界面上真实收听?
这是我的一小段代码:
TMulticastListener = class(TThread)
private
  mreq: ip_mreq;
  ............
end;
constructor TMulticastListener.Create;
var err: Integer;
    wData: WsaData;
    reuse: Integer;
begin
  inherited Create(true);
  err := WSAStartup(MAKEWORD(2, 2), wData);
  if err = SOCKET_ERROR then begin
    // Tell the user that we could not find a usable Winsock DLL
    perror('WSAStartup');
    Exit;
  end;
  // create what looks like an ordinary UDP socket
  fd := …我有一个Observable产生单播值(对于所有观察者来说都是如此)。但是,当我打算使用RxJs多播运算符转换为多播时,它将返回以下错误。
属性“连接”在类型“可观察”上不存在
单播(工作代码)-
let source4$ = interval(1000).pipe(take(4));
source4$.subscribe(val => {
    console.log(`Observer 1: ${val}`);
});
setTimeout(function() {
    source4$.subscribe(val => {
        console.log(`Observer 2: ${val}`);
    }); 
}, 1000);
setTimeout(function() {
    source4$.subscribe(val => {
        console.log(`Observer 3: ${val}`);
    }); 
}, 2000);
组播(无效代码)-
let source4$ = interval(1000).pipe(take(4), multicast(new Subject()));
source4$.subscribe(val => {
    console.log(`Observer 1: ${val}`);
});
setTimeout(function() {
    source4$.subscribe(val => {
        console.log(`Observer 2: ${val}`);
    }); 
}, 1000);
setTimeout(function() {
    source4$.subscribe(val => {
        console.log(`Observer 3: ${val}`);
    }); 
}, 2000);
source4$.connect();