почему многоадресная рассылка не может получить сообщение после запуска какое-то время?Как с этим бороться? - PullRequest
0 голосов
/ 26 декабря 2018

при присоединении к многоадресной рассылке работает хорошо.Но примерно через 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;

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...