shaohui973 发表于 2013-07-16 15:36

raw socket 绑定指定接口失败。

首先是创建一个套接口:
socket(PF_SOCKET, SOCK_RAW, htonl(ETH_P_ALL));

然后利用ioctl取出接口eth1的各种参数:ifindex,mac, ip 等等。
最后绑定该socket到这个eth1接口。(我需要监听来自这个网口的广播或者其他请求报文)

sockaddr_ll.
          sockaddr_ll.sll_family            = PF_PACKET;      
          sockaddr_ll.sll_protocol          = htons( ETH_P_ALL );
          sockaddr_ll.sll_ifindex             = 3;               /*AUI */
          sockaddr_ll.sll_hatype            = ARPHRD_ETHER;
          sockaddr_ll.sll_pkttype         = PACKET_OTHERHOST;
          sockaddr_ll.sll_halen             = ETH_ALEN;
         memcpy( sockaddr_ll.sll_addr, mac, 6);

最后bind时失败,errno = EINVAL;我打印了sockaddr_ll的各变量的值,没发现什么问题。
我这个bind到底失败在哪?求指导!谢谢。

卖萌犯法 发表于 2013-07-17 20:46

回复 1# shaohui973

af_packet.c

貌似只有这两种情况返回 EINVAL :

        if (addr_len < sizeof(struct sockaddr_ll))
                return -EINVAL;
        if (sll->sll_family != AF_PACKET)
                return -EINVAL;

看看你的 addr_len 传的对不对,bind 第三个参数。
页: [1]
查看完整版本: raw socket 绑定指定接口失败。