при присоединении к многоадресной рассылке работает хорошо.Но примерно через 1 час клиент не может получить сообщение, отправленное сервером. Почему?
это работает на centos 7.5
port_new->bind_addr.sin_family = AF_INET;
port_new->bind_addr.sin_port = cmcc_htons(port);
port_new->bind_addr.sin_addr.s_addr = inet_addr(maddr);
port_new->mreq.imr_interface.s_addr = cmcc_htonl(INADDR_ANY);
port_new->mreq.imr_multiaddr.s_addr = inet_addr(maddr);
port_new->sock_fd = socket(AF_INET, SOCK_DGRAM, 0);
if (port_new->sock_fd < 0)
{
goto socket_error;
}
ret = setsockopt(port_new->sock_fd, IPPROTO_IP, IP_ADD_MEMBERSHIP, &port_new->mreq, sizeof(port_new->mreq));
if(ret < 0)
{
printf("setsockopt() IP_ADD_MEMBERSHIP error: %s(errno: %d)\n", strerror(errno), errno);
goto setsockopt_error;
}
ret = setsockopt(port_new->sock_fd, IPPROTO_IP, IP_MULTICAST_TTL, &ttl, ttl);
if(ret < 0)
{
printf("setsockopt() IP_MULTICAST_TTL error: %s(errno: %d)\n", strerror(errno), errno);
goto setsockopt_error;
}
ret = setsockopt(port_new->sock_fd, IPPROTO_IP, IP_MULTICAST_LOOP, &loop, sizeof(loop));
if(ret < 0)
{
printf("setsockopt() IP_MULTICAST_LOOP error: %s(errno: %d)\n", strerror(errno), errno);
goto setsockopt_error;
}
ret = bind(port_new->sock_fd, (struct sockaddr *)&port_new->bind_addr, sizeof(port_new->bind_addr));
if(ret < 0)
{
printf("bind() error: %s(errno: %d)\n", strerror(errno), errno);
goto bind_error;
}
return port_new;
bind_error: setsockopt_error: close (port_new-> sock_fd);socket_error: cmcc_free (port_new);вернуть NULL;