Rob*_*ick 5 c linux udp multicast
我需要使用同一端口收听2个不同的多播组。Program A会从230.0.0.1和Program 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()...
Run Code Online (Sandbox Code Playgroud)
如何在每个程序中过滤特定的多播组?
如果你改变
in_addr.sin_addr.s_addr = htonl(INADDR_ANY);
Run Code Online (Sandbox Code Playgroud)
到
inet_aton(<your wanted IP address>, &in_addr.sin_addr.s_addr);
Run Code Online (Sandbox Code Playgroud)
你可以取得更大的成功。
(如果您更改程序以与 一起使用getaddrinfo(),则可以使其面向未来。)
| 归档时间: |
|
| 查看次数: |
7214 次 |
| 最近记录: |