首页 > 解决方案 > 来自 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)

失败的根本原因是什么?

标签: sockets

解决方案


该问题被跟踪到路由表中的问题。使用“netstat -r”表明没有设置到“默认”目的地的路由。一旦设置好,一切都开始按预期工作。感谢大家的帮助。


推荐阅读