当前位置: 首页 > 面试题库 >

UDP:侦听同一端口以获取两个不同的多播流

羊舌炯
2023-03-14
问题内容

我需要使用同一端口收听2个不同的多播组。Program A会从230.0.0.1Program B那里听230.0.0.2。两个多播组都使用相同的文件port 2000,但我无法控制它。

运行程序时,我在每个程序中都接收到两个多播流,即230.0.0.1和上广播的数据包230.0.0.2。我怀疑问题是由于通用端口引起的。这是我用来订阅多播的代码

if( (sd = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP)) < 0 ) {
  perror("socket");
  return -1;
}

if( setsockopt(sd, SOL_SOCKET, SO_REUSEADDR, &reuse, sizeof(reuse)) < 0 ) {
  perror("setsockopt SO_REUSEADDR");
  return -1;
}

memset(&in_addr, 0, sizeof(in_addr));
in_addr.sin_family = AF_INET;
in_addr.sin_addr.s_addr = htonl(INADDR_ANY);
in_addr.sin_port = htons(2000);
if( bind(sd, (struct sockaddr*)&in_addr, sizeof(in_addr)) < 0 ) {
  perror("bind");
  return -1;
}

memset(&req, 0, sizeof(req));
inet_aton(intfc_ip, &req.imr_interface);
inet_aton("230.0.0.1", &req.imr_multiaddr);
if( setsockopt(sd, IPPROTO_IP, IP_ADD_MEMBERSHIP, &req, sizeof(req)) < 0 ) {
  perror("setsockopt IP_ADD_MEMBERSHIP");
  return -1;
}

recv()...

如何在每个程序中过滤特定的多播组?


问题答案:

如果你改变

in_addr.sin_addr.s_addr = htonl(INADDR_ANY);

inet_aton(<your wanted IP address>, &in_addr.sin_addr.s_addr);

您可能会获得更大的成功。

(如果您更改程序以使用getaddrinfo(),则可以使其适应未来。)



 类似资料:
  • 我有一个监听两个不同端口的TCP服务器。我创建了两个不同的套接字,一个在端口8888上,一个在端口6634上。我监听这些端口,然后我在FD_SET中添加两个套接字,并将它们传递给Select()函数...当套接字准备好读取时,我检查FD_ISSET,看看哪个端口上有消息要读取。 不管怎样,当我连接到8888端口时,构思是成功的,我可以向服务器发送和接收。。。当我在客户端ctrl c时,选择函数再次

  • 我已经用重新启动了influxdb,但是没有任何帮助。 我错过了什么? 更新7.11.2016 21:59 更新13.4.2020问题已修复。 这是一个老问题,我不记得我到底是如何解决这个问题的,但我做到了。如果我没记错的话,问题是流入没有加载正确的配置文件,这是我自己当时的愚蠢。可悲的是,我不记得为什么会发生这种事,但我记得这是我自己做的。记住总是正确地阅读文档,并谷歌出它的sht。

  • 例如,我可以启动两个程序侦听端口371。第二个没有任何问题地启动并接收传入连接,而第一个没有。一旦最后开始的进程终止,第一个接收它们。 假设这是Windows(XP)行为,它怎么可能是安全的行为呢?这意味着人们可以“过载”任何已经侦听的端口,而不是获得通常的“地址已经在使用”错误消息,并简单地绕过防火墙,规则只是说“允许端口371上的任何传入TCP连接”。

  • 问题内容: 我有一个app.js,用于在接收到一些POST数据时触发两个事件: 将POST数据插入数据库 使用WebSocket向客户端发送消息 这是 app.js (仅重要的 几 行) 这是 server.js (仅重要的 几 行) 我想要实现的是以侦听应用程序相同端口的方式设置WebSocketServer。我考虑过将 服务器 var从 app.js 传递到 server.js, 但是 我认为

  • 问题内容: 我正在构建一个简单的Java服务器,该服务器使用两个ServerSocket实例同时在两个端口上同时侦听客户端请求。这是服务器的代码: 现在为Client1编码: Client2包含与Client1相同的代码,唯一的区别是它尝试连接到端口3000。现在,我首先使用命令提示符执行Server.java。服务器阻塞时,我打开两个单独的命令提示符,并在一个命令提示符下执行Client1.ja

  • 问题内容: 我有一个,并且里面有两个。当我按下一个键时,他们两个都必须收听此键事件并采取行动。我要处理所有键盘事件,并将它们传递给两个s。你知道怎么做吗? 编辑:由于他们必须做不同的事情,所以我需要两个不同的侦听器,对不起您不明确。 Edit2:我编写了一个简单的代码来向您展示问题。当我按下向上键时,两个显示的s都必须更改其字符串。在此代码中,只有其中一个实际反应! 问题答案: 代替,使用 按键绑