语言: 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.
然后操作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);
}
google了没有发现有人遇到类似的问题。
希望大家能解决。谢谢