我试图使用setsockopt函数将一个地址添加到接口的多播地址列表中,但是它在EINVAL中失败了。我在内核代码中放置了一些printk,看起来最终在内核packet_setsockopt函数中设置了errno,因为optlen的值小于packet_mreq结构的大小。为了我的生命,我不知道为什么会发生这种事。以下是相关代码:
int addMulticastAddress(int ifindex, unsigned char macaddr[6]) {
struct packet_mreq mreq;
int fd;
int ret = -1;
if ((fd = socket(AF_PACKET, SOCK_RAW, htons(ETH_P_ALL))) < 0) {
return -1;
}
memset(&mreq, 0, sizeof(struct packet_mreq));
mreq.mr_ifindex = ifindex;
mreq.mr_type = PACKET_MR_MULTICAST;
memcpy(mreq.mr_address, macaddr, 6);
mreq.mr_alen = 6;
if (setsockopt(fd, SOL_PACKET,
PACKET_ADD_MEMBERSHIP,
&mreq, sizeof(struct packet_mreq) < 0)) {
virReportSystemError(errno,
_("Failed to %s %s %s multicast list for '%s' interface"),
add ? "add" : "delete",
virMacAddrFormat(macaddr, macstr),
add ? "to" : "from", ifname);
goto cleanup;
}
ret = 0;
cleanup:
close(fd);
return ret;
}发布于 2014-09-02 21:11:05
你的括号中有一个在错误的地方:
if (setsockopt(fd, SOL_PACKET,
PACKET_ADD_MEMBERSHIP,
&mreq, sizeof(struct packet_mreq) < 0)) {应:
if (setsockopt(fd, SOL_PACKET,
PACKET_ADD_MEMBERSHIP,
&mreq, sizeof(struct packet_mreq)) < 0) {https://stackoverflow.com/questions/25632019
复制相似问题