Descartando a maioria dos pacotes multicast

1

Eu tenho um aplicativo que recebe pacotes multicast. Se eu direcionar o receptor para o transmissor, ele recebe tudo bem. Se eu adicionar um roteador entre o transmissor e o receptor, ele descartará a maioria dos pacotes.

Eu percebo que multicast não é garantido, no entanto, está se comportando de forma estranha. O transmissor envia ~ 250 pacotes multicast que são 1490 bytes em uma sequência que leva cerca de 4 microssegundos, 10 vezes a cada segundo. Eu recebo os primeiros ~ 80 pacotes, derrubo o outro ~ 170 cada vez.

Eu também testei meu código no openSUSE e conectei ao mesmo roteador e funcionou bem. Então eu testei com o Windows e funcionou bem. Então, estou começando a pensar que meu Ubuntu está mal configurado. Especialmente dada a baixa taxa de dados.

Qualquer ajuda seria apreciada.

Se ajudar, o seguinte é o código usado para criar o soquete multicast e receber (no Windows eu usei boost):

// Create the socket
int socket = socket(AF_INET, SOCK_DGRAM, 0);
if (!socket) throw std::runtime_error(strerror(errno));

int reuse = 1;
if (setsockopt(socket, SOL_SOCKET, SO_REUSEADDR, (const char*)&reuse, sizeof(reuse)) < 0)
{
    throw std::runtime_error(strerror(errno));
}

struct sockaddr_in endpoint;
memset(&endpoint, 0, sizeof(endpoint));
local.sin_family = AF_INET;
local.sin_port = htons(port);
local.sin_addr.s_addr = INADDR_ANY;
if (bind(socket, (struct sockaddr*)&endpoint, sizeof(endpoint)) < 0)
{
    throw std::runtime_error(strerror(errno));
}

struct ip_mreq group;
group.imr_multiaddr.s_addr = inet_addr(ip.c_str());
group.imr_interface.s_addr = INADDR_ANY;
if (setsockopt(socket, IPPROTO_IP, IP_ADD_MEMBERSHIP, (const char*)&group, sizeof(group)) < 0)
{
    throw std::runtime_error(strerror(errno));
}

int recvBufferSize = 8 * 1024 * 1024;
if (setsockopt(socket, SOL_SOCKET, SO_RCVBUF, (const char*)&recvBufferSize, sizeof(recvBufferSize)) < 0)
{
    throw std::runtime_error(strerror(errno));
}

// receive data
socklen_t addrLen = sizeof(endpoint);
const ssize_t rc = recvfrom(socket, msg, size, 0, (struct sockaddr*)endpoint, &addrLen);
if (rc < 0) throw std::runtime_error(strerror(errno));
    
por steveo225 27.09.2016 / 13:24

1 resposta

0

Verifique se os pacotes estão fazendo o NIC primeiro, use wireshark ou

% bl0ck_qu0te%     
por meccooll 28.09.2016 / 05:02