提问者:小点点

在ARM64上多播“没有这样的设备”?


这是来自一个工作的遗留代码库,该代码库已经被移植到其他几个硬件平台,并且仍然被它们共享,因此对此方法进行重大更改不是一个好的解决方案。 这是ZCU111 ARM64的新端口。 Linux内核构建时支持多播(config_ip_multicast=y)。

这是代码的摘要:

const char *const MULTICAST_IP = "224.0.0.26";
const unsigned int BCAST_PORT = 35001;
struct ip_mreq mreq;
int optval = 1;
int optlen = sizeof(int);
int fd = socket(AF_INET,SOCK_DGRAM,0);
int flags = fcntl(fd,F_GETFL,0);
fcntl(fd,F_SETFL,flags|O_NONBLOCK);
setsockopt(fd,SOL_SOCKET,SO_REUSEADDR,&optval,optlen);
bzero(&sock_addr,sizeof(sock_addr));
sock_addr.sin_family=AF_INET;
sock_addr.sin_addr.s_addr=htonl(INADDR_ANY);
sock_addr.sin_port=htons(BCAST_PORT);
bind(fd,reinterpret_cast<const sockaddr *>(&sock_addr),sizeof(struct sockaddr_in));
mreq.imr_multiaddr.s_addr = inet_addr(MULTICAST_IP);
mreq.imr_interface.s_addr = htonl(INADDR_ANY);
if (setsockopt(fd,IPPROTO_IP,IP_ADD_MEMBERSHIP,&mreq,sizeof(mreq))<0) PRINTF_ERROR;

PRINTF_ERROR用于打印文件,行,函数,strerror和errno,如下所示:

gps.cpp:93 (GetFileDescriptor) ERROR No such device 19

将IPPROTO_IP更改为IPPROTO_UDP会导致以下错误:

gps.cpp:93 (GetFileDescriptor) ERROR Protocol not available 92

我已经看过这些解决方案,但不确定它们如何适用于这种情况。 知道如何修复“没有这样的设备”错误吗?


共1个答案

匿名用户

我并不认为这个答案是我的功劳(在网上找到的),但为了保持知识共享,我将把解决方案贴在这里。

这个问题似乎本质上是组播组路由的中断,可以通过以下命令来解决:

route add -net 224.0.0.0 netmask 224.0.0.0 eth0