У меня есть в общем виде следующий код сокета многоадресной рассылки. Он работает нормально. Теперь мне нужно соединить две широковещательные каналы на той же машине, как 224.10.13.18 - 55001 224.10.13.34 - 55001Как использовать два многоадресных сокета для прослушивания двух многоадресных каналов с одним и тем же портом
и в зависимости от IP-адреса он пришел, мне нужно обработать сообщение другому.
Вопрос заключается в том, как использовать создание двух сокетов для многоадресных каналов, где значения порта одинаковы, так что каждый сокет возвращает данные только на данные, которые отправляются на этот канал.
/* create socket to join multicast group on */
socket_file_descriptor_ = socket (AF_INET, SOCK_DGRAM, IPPROTO_UDP);
if (socket_file_descriptor_ < 0)
{ // fprintf (stderr, "cannot open socket \n");
exit(1);
}
/* set reuse port to on to allow multiple binds per host */
{
int flag_on = 1;
if ((setsockopt (socket_file_descriptor_, SOL_SOCKET, SO_REUSEADDR, &flag_on,
sizeof(flag_on))) < 0)
{ // fprintf (stderr, "MulticastReceiverSocket setsockopt() SOL_SOCKET SO_REUSEADDR failed\n");
exit(1);
}
}
struct ip_mreq mc_req;
inet_pton (AF_INET, listen_ip_.c_str(), &(mc_req.imr_multiaddr.s_addr));
mc_req.imr_interface.s_addr = htonl(INADDR_ANY);
/* send an ADD MEMBERSHIP message via setsockopt */
if ((setsockopt (socket_file_descriptor_, IPPROTO_IP, IP_ADD_MEMBERSHIP,
(void*) &mc_req, sizeof(mc_req))) < 0)
{ // std::cerr << "setsockopt() failed in IP_ADD_MEMBERSHIP " << listen_ip_ << ": "<< listen_port_ << std::endl;
exit(1);
}
/* construct a multicast address structure */
struct sockaddr_in mcast_Addr;
bzero (&mcast_Addr, sizeof(mcast_Addr));
mcast_Addr.sin_family = AF_INET;
mcast_Addr.sin_addr.s_addr = htonl(INADDR_ANY);
mcast_Addr.sin_port = htons (listen_port_);
/* bind to specified port onany interface */
if (bind (socket_file_descriptor_, (struct sockaddr *) &mcast_Addr, sizeof (struct sockaddr_in)) < 0)
{ // fprintf (stderr, "%s cannot bind %s:%d \n", "MulticastReceiverSocket", listen_ip_.c_str(), listen_port_) ;
exit(1);
}
Используйте два гнезда. – PlasmaHH
И вопрос в том, что? Здесь нет никаких вопросов, и вы не указали сообщение об ошибке, чтобы указать, что код, который вы опубликовали, не работает, но попробуйте выполнить привязку перед добавлением. – EJP
Я не знаю, правильно ли я понял: 1. Вы хотите слушать две разные машины на одной машине на одном порту и действовать в зависимости от того, к какой машине подключается к вам, или 2. Вы хотите прослушивать два разных адреса Ip (2 разные сетевые карты, я полагаю) и действуют в зависимости от того, кто подключается к какой машине –