当前时区为 UTC + 8 小时



发表新帖 回复这个主题  [ 3 篇帖子 ] 
作者 内容
1 楼 
 文章标题 : bind结构体sockaddr_ll出现invalid argument
帖子发表于 : 2016-03-03 22:22 

注册: 2014-10-28 14:53
帖子: 60
系统: ubuntu-14.04-LST
送出感谢: 1
接收感谢: 0 次
系统: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了没有发现有人遇到类似的问题。
希望大家能解决。谢谢


页首
 用户资料  
 
2 楼 
 文章标题 : Re: bind结构体sockaddr_ll出现invalid argument
帖子发表于 : 2016-03-05 13:09 

注册: 2014-10-28 14:53
帖子: 60
系统: ubuntu-14.04-LST
送出感谢: 1
接收感谢: 0 次
:Cry 没人解答吗


页首
 用户资料  
 
3 楼 
 文章标题 : Re: bind结构体sockaddr_ll出现invalid argument
帖子发表于 : 2016-03-05 13:35 

注册: 2014-10-28 14:53
帖子: 60
系统: ubuntu-14.04-LST
送出感谢: 1
接收感谢: 0 次
这个问题已经解决了,谢谢大家
问题出在这里
代码:
if (-1 == bind(pskfd, (struct sockaddr *)&ll, sizeof(struct sockaddr))) {

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


页首
 用户资料  
 
显示帖子 :  排序  
发表新帖 回复这个主题  [ 3 篇帖子 ] 

当前时区为 UTC + 8 小时


在线用户

正在浏览此版面的用户:没有注册用户 和 2 位游客


不能 在这个版面发表主题
不能 在这个版面回复主题
不能 在这个版面编辑帖子
不能 在这个版面删除帖子
不能 在这个版面提交附件

前往 :  
本站点为公益性站点,用于推广开源自由软件,由 DiaHosting VPSBudgetVM VPS 提供服务。
我们认为:软件应可免费取得,软件工具在各种语言环境下皆可使用,且不会有任何功能上的差异;
人们应有定制和修改软件的自由,且方式不受限制,只要他们自认为合适。

Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
简体中文语系由 王笑宇 翻译