sockets - 来自 setsockopt 的 ENODEV 错误的原因是什么
问题描述
我们使用以下代码(只是一个片段)来设置多个多播套接字(操作系统:Redhat Linux):
sockfd[i] = socket (PF_INET, SOCK_DGRAM, IPPROTO_IP);
if (setsockopt(sockfd[i], SOL_SOCKET, SO_REUSEADDR, (char*)&on, sizeof(on)) < 0) {....}
if (bind (sockfd[i], (struct sockaddr*)&skin, sizeof(skin)) < 0) {....}
if (setsockopt(sockfd[i], IPPROTO_IP, IP_ADD_MEMBERSHIP, (char*)&mreq, sizeof(mreq)) < 0) {....}
一切似乎都适用于除一个之外的所有套接字;在失败的情况下,跟踪显示以下内容:
socket(PF_INET, SOCK_DGRAM, IPPROTO_IP) = 6
setsockopt(6, SOL_SOCKET, SO_REUSEADDR, [1], 4) = 0
bind(6, {sa_family=AF_INET, sin_port=htons(9050), sin_addr=inet_addr("0.0.0.0")}, 16) = 0
setsockopt(6, SOL_SOCKET, SO_RCVBUF, [66560], 4) = 0
setsockopt(6, SOL_IP, IP_ADD_MEMBERSHIP, "\340y\324{\0\0\0\0", 8) = -1 ENODEV (No such device)
失败的根本原因是什么?
解决方案
该问题被跟踪到路由表中的问题。使用“netstat -r”表明没有设置到“默认”目的地的路由。一旦设置好,一切都开始按预期工作。感谢大家的帮助。
推荐阅读
- c - 如何交换使用指向数组的指针定义的二维数组中的行?
- firebase - 如何在 vuetify 和 firebase 中使用 v-for 动态添加图像
- flask - Flask-Login 未注册用户给出 500 错误
- python - 用二进制值重新采样熊猫数据帧的问题
- sql - 在 Entity Framework Core / LINQ 中为 group by / count() 优化查询
- spring-boot - AWS Secrets Manager 和 springboot
- node.js - Sequelize.authenticate() 对 Docker 内的谷歌云 sql 连接不起作用(没有成功或错误响应)
- java - Jackson ObjectMapper 默认属性顺序
- javascript - 每次在 React 中创建元素时,我都找不到在元素上进行 CSS 转换的方法
- f# - 如何将“Hello ML.NET World”示例翻译成 F#?