我如何设法加入地址为 udp://@224.1.50.15:1234
的多播 mpeg 流组?我想要管理的只是与流服务器建立连接,让服务器知道我对这个多播组感兴趣,让服务器在一段时间内向我发送流数据包。
举个例子: 在我使用 VLC Player 建立与该组的连接之前,我没有收到来自该组播组的任何数据包。即使在我关闭 VLC 播放器后,我也会在短时间内继续接收来自该组的数据包。我想做的是在没有 VLC Player 或任何其他第三方应用程序的帮助下接收数据包。
为了上述目的,我如何设法与该组建立联系。如果可能的话?
P.S:我安装了 4 个网络接口(interface)。
谢谢!
作为 Zaboj Campula 在本页回答中的推荐;我更改了代码如下。这给了我一个错误 10093。
struct ip_mreq {
struct in_addr imr_multiaddr; /* IP multicast address of group */
struct in_addr imr_interface; /* local IP address of interface */
};
SOCKET s;
SOCKADDR_IN localif;
struct ip_mreq mreq;
s = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
localif.sin_family = AF_INET;
localif.sin_port = htons(1234);
localif.sin_addr.s_addr = INADDR_ANY;
bind(s, (SOCKADDR *)&localif, sizeof(localif));
mreq.imr_interface.s_addr = INADDR_ANY; //Writing here my local ip didn't change the result.
mreq.imr_multiaddr.s_addr = inet_addr("224.1.50.15");
int rc = NO_ERROR;
s = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
// Join the group
rc = setsockopt(s, IPPROTO_IP, IP_ADD_MEMBERSHIP, (char *)&mreq, sizeof(mreq));
if (rc == SOCKET_ERROR)
{
printf("JoinMulticastGroup: setsockopt failed with error code %d\n", WSAGetLastError());
}
else
{
printf("Joined group: ");
//PrintAddress(group->ai_addr, group->ai_addrlen);
printf("\n");
}
最佳答案
UDP 套接字不支持连接。不可能在 UDP 套接字上调用 listen
和 accept
。当UDP套接字绑定(bind)到本地端口时,您可以直接从UDP套接字读取。
套接字选项 IP_ADD_MEMBERSHIP
将套接字加入多播组。
struct ip_mreq m;
m.imr_interface.s_addr = inet_addr(loca_ip_address);
m.imr_multiaddr.s_addr = inet_addr("224.1.50.15");
setsockopt(s, IPPROTO_IP, IP_ADD_MEMBERSHIP, (char *)&m, sizeof(m));
您可以在 http://www.winsocketdotnetworkprogramming.com/winsock2programming/winsock2advancedmulticast9a.html 找到完整示例
关于C++ 如何加入多播 mpeg 流?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41258742/