首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么setsockopt返回EINVAL?

为什么setsockopt返回EINVAL?
EN

Stack Overflow用户
提问于 2014-09-02 20:41:22
回答 1查看 995关注 0票数 0

我试图使用setsockopt函数将一个地址添加到接口的多播地址列表中,但是它在EINVAL中失败了。我在内核代码中放置了一些printk,看起来最终在内核packet_setsockopt函数中设置了errno,因为optlen的值小于packet_mreq结构的大小。为了我的生命,我不知道为什么会发生这种事。以下是相关代码:

代码语言:javascript
复制
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;
}
EN

回答 1

Stack Overflow用户

发布于 2014-09-02 21:11:05

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

代码语言:javascript
复制
if (setsockopt(fd, SOL_PACKET,
    PACKET_ADD_MEMBERSHIP,
    &mreq, sizeof(struct packet_mreq) < 0)) {

应:

代码语言:javascript
复制
if (setsockopt(fd, SOL_PACKET,
    PACKET_ADD_MEMBERSHIP,
    &mreq, sizeof(struct packet_mreq)) < 0) {
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25632019

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档