![丢弃大多数多播数据包](https://linux22.com/image/994016/%E4%B8%A2%E5%BC%83%E5%A4%A7%E5%A4%9A%E6%95%B0%E5%A4%9A%E6%92%AD%E6%95%B0%E6%8D%AE%E5%8C%85.png)
我有一个接收多播数据包的应用程序。如果我将接收器直接连接到发送器,它会正常接收所有内容。如果我在发送器和接收器之间添加路由器,它会丢弃大多数数据包。
我意识到多播并不能保证,但是它的行为很奇怪。发送器每秒发送 10 次,每次发送约 250 个 1490 字节的多播数据包,每次大约需要 4 微秒。我每次都收到前约 80 个数据包,然后丢弃其余约 170 个数据包。
我还在 openSUSE 上测试了我的代码,并连接到同一个路由器,它运行良好。然后我在 Windows 上测试,它运行良好。所以,我开始认为我的 Ubuntu 配置错误。特别是考虑到低数据速率。
任何帮助,将不胜感激。
如果有帮助,以下是用于创建多播套接字和接收的代码(在 Windows 上我使用了 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));
答案1
检查数据包是否首先到达 NIC,使用 wireshark 或
sudo tcpdump -nn dst 224.XXX #在此处输入你的多播 IP