在 ARM64 上多播 'no such device'?
Multicast 'no such device' on 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 用于打印 FILE、LINE、func、strerror 和 errno,如下所示:
gps.cpp:93 (GetFileDescriptor) ERROR No such device 19
将 IPPROTO_IP 更改为 IPPROTO_UDP 会导致以下错误:
gps.cpp:93 (GetFileDescriptor) ERROR Protocol not available 92
我已经看过 these solutions 但不确定它们在这种情况下如何应用。
知道如何修复 'No such device' 错误吗?
我不承认这个答案(找到它 online),但为了保持共享知识,post 将在此处提供解决方案。
这个问题似乎本质上是多播组路由中断,可以使用以下命令修复:
route add -net 224.0.0.0 netmask 224.0.0.0 eth0
这来自一个有效的遗留代码库,该代码库已经被移植到其他几个硬件平台并且仍然由其他几个硬件平台共享,因此对该方法进行重大更改并不是一个好的解决方案。 这是 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 用于打印 FILE、LINE、func、strerror 和 errno,如下所示:
gps.cpp:93 (GetFileDescriptor) ERROR No such device 19
将 IPPROTO_IP 更改为 IPPROTO_UDP 会导致以下错误:
gps.cpp:93 (GetFileDescriptor) ERROR Protocol not available 92
我已经看过 these solutions 但不确定它们在这种情况下如何应用。 知道如何修复 'No such device' 错误吗?
我不承认这个答案(找到它 online),但为了保持共享知识,post 将在此处提供解决方案。
这个问题似乎本质上是多播组路由中断,可以使用以下命令修复:
route add -net 224.0.0.0 netmask 224.0.0.0 eth0