gpt4 book ai didi

linux - 为什么 setsockopt 返回 EINVAL?

转载 作者:太空宇宙 更新时间:2023-11-04 11:04:59 25 4
gpt4 key购买 nike

我正在尝试使用 setsockopt 函数将地址添加到接口(interface)的多播地址列表中,但失败并显示错误号 EINVAL。我在内核代码中放置了一些 printk,看起来 errno 最终是在内核 packet_setsockopt 函数中设置的,因为传递给 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;
}

最佳答案

你的一个括号在错误的地方:

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) {

关于linux - 为什么 setsockopt 返回 EINVAL?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25632019/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com