bind结构体sockaddr_ll出现invalid argument

软件和网站开发以及相关技术探讨
回复
leetking
帖子: 62
注册时间: 2014-10-28 14:53
系统: ubuntu-18.04-LTS

bind结构体sockaddr_ll出现invalid argument

#1

帖子 leetking » 2016-03-03 22:22

系统:buntu 14.04LTS
语言: c语言
编译器:

代码: 全选

gcc (Ubuntu 4.8.4-2ubuntu1~14.04.1) 4.8.4
Copyright (C) 2013 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
我建立一个struct sockaddr_ll变量打算去实现arp查询。
然后操作sock和初始化sockaddr_ll变量的代码如下

代码: 全选

struct sockaddr_ll ll;
struct ifreq ifr;
if (-1 == (pskfd = socket(AF_PACKET, SOCK_RAW, ETH_P_ARP))) {
	perror("socket");
	exit(1);
}
memset(&ll, 0, sizeof(struct sockaddr_ll));
memset(&ifr, 0, sizeof(struct ifreq));
strncpy(ifr.ifr_name, "eth0", 4);
/* 请求接口号,这里请求的字节序是本地的字节序 */
if (-1 == ioctl(pskfd, SIOCGIFINDEX, &ifr)) {
	perror("ioctl index");
	exit(1);
}
ll.sll_ifindex = ifr.ifr_ifindex;	/* 不是发送到网络上的,不用管字节序 */
printf("eth0 Index: %d\n", ifr.ifr_ifindex);

/* 获取mac地址 */
if (-1 == ioctl(pskfd, SIOCGIFHWADDR, &ifr)) {
	perror("ioctl mac");
	exit(1);
}
/* NOTE 学习这个mac获取方式 */
memcpy(srcmac, ifr.ifr_hwaddr.sa_data, ETH_ALEN);
printf("srcMAC :%s\n", format_mac(srcmac));
/* 请求接口ip地址 */
if (-1 == ioctl(pskfd, SIOCGIFADDR, &ifr)) {
	perror("ioctl ip");
	exit(1);
}
srcIP.s_addr = ((struct sockaddr_in*)&(ifr.ifr_addr))->sin_addr.s_addr;
printf("srcIP:%s\n", inet_ntoa(srcIP));

ll.sll_family = PF_PACKET;		/* 2bytes */
ll.sll_protocol = ETH_P_ARP;	/* 2bytes */
/* ll.sll_ifindex = ??已给出 */
ll.sll_hatype = ARPHRD_ETHER;	/* 2bytes */
ll.sll_pkttype = PACKET_HOST;	/* 1bytes TODO 这是什么? */
ll.sll_halen = ETH_ALEN;		/* 1bytes */
memcpy(ll.sll_addr, srcmac, ETH_ALEN);
/* bind一下,可以简化send吗和接受吗? */
if (-1 == bind(pskfd, (struct sockaddr *)&ll, sizeof(struct sockaddr))) {
	perror("bind");
	exit(1);
}
然后已root运行,出现bind: invalid argument
google了没有发现有人遇到类似的问题。
希望大家能解决。谢谢
leetking
帖子: 62
注册时间: 2014-10-28 14:53
系统: ubuntu-18.04-LTS

Re: bind结构体sockaddr_ll出现invalid argument

#2

帖子 leetking » 2016-03-05 13:09

:Cry 没人解答吗
leetking
帖子: 62
注册时间: 2014-10-28 14:53
系统: ubuntu-18.04-LTS

Re: bind结构体sockaddr_ll出现invalid argument

#3

帖子 leetking » 2016-03-05 13:35

这个问题已经解决了,谢谢大家
问题出在这里

代码: 全选

if (-1 == bind(pskfd, (struct sockaddr *)&ll, sizeof(struct sockaddr))) {
正确的应该是

代码: 全选

if (-1 == bind(pskfd, (struct sockaddr *)&ll, sizeof(struct sockaddr_ll))) {
回复