同一台机器上的多个多播通道 - 指定地址或使用 INADDR_ANY?
Multiple multicast channels on same machine- specify an address or use INADDR_ANY?
下面是在 Linux 上创建多播套接字的基本代码。
我在一台机器上有多个进程 运行 下面的代码,每个进程监听不同的多播频道。每个进程只应处理相关数据。
代码中的两个阶段需要一个地址,或者INADDR_ANY
。
考虑到我将有多个 单独的 多播频道 运行,我不确定何时应该使用 INADDR_ANY
或指定地址。我不希望进程接收到错误的多播数据。
// Create socket
int sock = socket(AF_INET, SOCK_DGRAM, 0);
setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, &yes, sizeof(yes));
// Create multicast group
sockaddr_in mcast_group
memset(&mcast_group, 0, sizeof(mcast_group));
mcast_group.sin_family = AF_INET;
mcast_group.sin_port = htons(mcastPort);
mcast_group.sin_addr.s_addr = INADDR_ANY; // INADDR_ANY or specific address?
// Bind socket to multicast group
bind(sock, (struct sockaddr*)&mcast_group, sizeof(mcast_group));
// Tell Kernel to join multicast group
struct ip_mreq mreq;
mreq.imr_multiaddr.s_addr = inet_addr(group.c_str());
mreq.imr_interface.s_addr = inet_addr(interface.c_str()); // INADDR_ANY or specific address?
setsockopt(sock, IPPROTO_IP, IP_ADD_MEMBERSHIP, &mreq, sizeof(mreq));
如果每个套接字仅监听多播数据包而不是单播,并且只监听一个多播地址,您可以直接绑定到多播地址:
sockaddr_in mcast_group;
memset(&mcast_group, 0, sizeof(mcast_group));
mcast_group.sin_family = AF_INET;
mcast_group.sin_port = htons(mcastPort);
mcast_group.sin_addr.s_addr = inet_addr(group.c_str()); // bind to multicast group
bind(sock, (struct sockaddr*)&mcast_group, sizeof(mcast_group));
请注意,您仍然需要加入多播组。
绑定到 INADDR_ANY 将接收单播和多播数据包。绑定到多播地址将只接收多播数据包。这是 Linux 套接字和 Windows 套接字编程之间的区别,用于多播接收。
下面是在 Linux 上创建多播套接字的基本代码。
我在一台机器上有多个进程 运行 下面的代码,每个进程监听不同的多播频道。每个进程只应处理相关数据。
代码中的两个阶段需要一个地址,或者INADDR_ANY
。
考虑到我将有多个 单独的 多播频道 运行,我不确定何时应该使用 INADDR_ANY
或指定地址。我不希望进程接收到错误的多播数据。
// Create socket
int sock = socket(AF_INET, SOCK_DGRAM, 0);
setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, &yes, sizeof(yes));
// Create multicast group
sockaddr_in mcast_group
memset(&mcast_group, 0, sizeof(mcast_group));
mcast_group.sin_family = AF_INET;
mcast_group.sin_port = htons(mcastPort);
mcast_group.sin_addr.s_addr = INADDR_ANY; // INADDR_ANY or specific address?
// Bind socket to multicast group
bind(sock, (struct sockaddr*)&mcast_group, sizeof(mcast_group));
// Tell Kernel to join multicast group
struct ip_mreq mreq;
mreq.imr_multiaddr.s_addr = inet_addr(group.c_str());
mreq.imr_interface.s_addr = inet_addr(interface.c_str()); // INADDR_ANY or specific address?
setsockopt(sock, IPPROTO_IP, IP_ADD_MEMBERSHIP, &mreq, sizeof(mreq));
如果每个套接字仅监听多播数据包而不是单播,并且只监听一个多播地址,您可以直接绑定到多播地址:
sockaddr_in mcast_group;
memset(&mcast_group, 0, sizeof(mcast_group));
mcast_group.sin_family = AF_INET;
mcast_group.sin_port = htons(mcastPort);
mcast_group.sin_addr.s_addr = inet_addr(group.c_str()); // bind to multicast group
bind(sock, (struct sockaddr*)&mcast_group, sizeof(mcast_group));
请注意,您仍然需要加入多播组。
绑定到 INADDR_ANY 将接收单播和多播数据包。绑定到多播地址将只接收多播数据包。这是 Linux 套接字和 Windows 套接字编程之间的区别,用于多播接收。