setsockopt调用IP_ADD_MEMBERSHIP出错errno:19 no such device

if (setsockopt(fd,IPPROTO_IP,IP_ADD_MEMBERSHIP,&mreq,sizeof(mreq)) < 0) {
                printf("setsockopt fail, try again\n");
            usleep(200 * 1000);
                continue;

            }

 

提示: setsockopt fail, try again

此时,errno:19     --> no such device

 

这主要和当前的网络配置有关,因为多播IP地址没有加入到路由表中。

 

解决方法:把需要用到的多播地址(如本例的224.0.0.88)加入到路由表中,命令如下:

sudo route add -net 224.0.0.88 netmask 255.255.255.255 eth0

224.0.0.88:为当前使用的多播IP地址

eth0:为当前使用的有效网卡

其它辅助命令:

sudo route del -net 224.0.0.88 netmask 255.255.255.255 eth0 //把224.0.0.88从路由表中删除

route -n //查看路由表信息

要在 FreeRTOS RAW 接口上实现 `setsockopt(socket, IPPROTO_IP, join ? IP_ADD_MEMBERSHIP : IP_DROP_MEMBERSHIP, &mreq, sizeof (mreq))` 功能,需要对 `setsockopt` 函数进行扩展,以支持 IP 层的多播成员管理选项。 以下是一个示例实现: ```c #include "lwip/raw.h" #include "lwip/sockets.h" #include "lwip/ip_addr.h" // 假设 KT_return_t 和 KT_RT_socket_t 的定义 typedef int KT_return_t; typedef int KT_RT_socket_t; KT_return_t KT_RT_setsockopt(KT_RT_socket_t sock, int32_t level, int32_t optname, const void *optval, socklen_t optlen) { struct raw_pcb *pcb = (struct raw_pcb *)sock; int ret = -1; if (level == IPPROTO_IP) { switch (optname) { case IP_ADD_MEMBERSHIP: { struct ip_mreq *mreq = (struct ip_mreq *)optval; // 检查参数是否合法 if (optlen == sizeof(struct ip_mreq)) { // 调用 LwIP 的多播加入函数 // 这里需要根据 LwIP 的具体 API 进行操作 // 假设存在一个函数 ip_add_membership 用于加入多播组 // ip_add_membership(pcb, &mreq->imr_multiaddr, &mreq->imr_interface); ret = 0; } break; } case IP_DROP_MEMBERSHIP: { struct ip_mreq *mreq = (struct ip_mreq *)optval; // 检查参数是否合法 if (optlen == sizeof(struct ip_mreq)) { // 调用 LwIP 的多播离开函数 // 假设存在一个函数 ip_drop_membership 用于离开多播组 // ip_drop_membership(pcb, &mreq->imr_multiaddr, &mreq->imr_interface); ret = 0; } break; } default: ret = -1; break; } } return ret; } ``` 在上述代码中,首先检查 `level` 是否为 `IPPROTO_IP`,然后根据 `optname` 是 `IP_ADD_MEMBERSHIP` 还是 `IP_DROP_MEMBERSHIP` 进行不同的处理。对于每个选项,会检查 `optval` 的长度是否为 `sizeof(struct ip_mreq)`,以确保传入的参数合法。 需要注意的是,上述代码中的 `ip_add_membership` 和 `ip_drop_membership` 函数是假设存在的,实际实现中需要根据 LwIP 的具体 API 进行替换。 ###
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值