分类:
2007-08-21 11:21:07
#include <stdio.h>
#include <unistd.h>
#include <signal.h>
#include <string.h>
#include <errno.h>
#include <sys/socket.h>
#include <linux/if_ether.h>
#include <linux/in.h>
#include <sys/ioctl.h>
#include <linux/sockios.h>
#include <net/if.h>
#define snif_buffer_size 2048
#define _xff(t) ((t)&0xff)
#define snif_addr_mac(p) \
_xff((p)[0]),_xff((p)[1]),_xff((p)[2]),_xff((p)[3]),_xff((p)[4]),_xff((p)[5])
#define snif_addr_ip(p) _xff((p)[0]),_xff((p)[1]),_xff((p)[2]),_xff((p)[3])
static int isc;
static void exit_while(int signo)
{
isc = 0;
}
int main(int argc, char **argv)
{
int sd, rlen;
char buf[snif_buffer_size];
char *p;
struct ifreq ethreq;
/* ctrl c */
signal(sigint, exit_while);
if ((sd = socket(pf_packet, sock_raw, htons(eth_p_ip))) < 0)
{
fprintf(stderr, "socket create error: %s\n", strerror(errno));
goto err_ret;
}
strncpy(ethreq.ifr_name, "eth0", ifnamsiz);
ioctl(sd, siocgifflags, ðreq);
ethreq.ifr_flags |= iff_promisc;
ioctl(sd, siocsifflags, ðreq);
isc = 1;
while (isc)
{
rlen = recvfrom(sd, buf, snif_buffer_size, 0, null, null);
if (rlen < 42)
{
fprintf(stderr, "recv incomplete header information. \n");
continue;
}
p = buf;
/* dest mac addr [6] | src mac addr [6] | type [2]
* | ip data packet
*/
printf("mac: %.2x:%.2x:%.2x:%.2x:%.2x:%.2x ==> %.2x:%.2x:%.2x:%.2x:%.2x:%.2x "
, snif_addr_mac(&p[6]), snif_addr_mac(p));
/* other ip data [12] | src ip addr [4] | dest ip addr [4]
* | tcp/udp data packet
*/
p = (6 6 2 12);
printf("ip %d.%d.%d.%d ==> %d.%d.%d.%d \n"
, snif_addr_ip(p), snif_addr_ip(&p[4]));
}
close(sd);
return (0);
err_ret:
return (-1);
}
以root运行, 看到奇怪的东西:
mac: 00:00:00:00:00:00 ==> 00:00:00:00:00:00 ip 127.0.0.1 ==> 127.0.0.1
很多mac 0地址, 不知为何?
原来在学校学习的tcp/ip什么的还以为没什么用处, 现在感觉学的太少, 还得补噢!
google到, 以下为解释, 广播?
前两天同事抓到了包括mac地址全0的包,在讨论和请教牛人后,大概得出的结论是这种mac地址在共享网络下面是有效的。据说 long long
ago时这种mac地址和主机地址部分全0的ip地址一样,是用于广播的(rain提供)。不过现在这种mac好像已经不再作为特殊地址保留(scz测
试),而部分系统如bsd系列还保留主机地址全0的ip地址的广播效果。
scz的详细测试结果如下:
以下为引用:
1) linux
linux下ifconfig修改mac地址前必须先down掉相应接口,改了mac之后再
up。但是linux下将mac设置成全零后(此时无错误提示),相应接口up失败:
ifconfig eth0 hw ether 00:00:00:00:00:00
linux虽然自身无法设置全零mac,但可与全零mac的系统正常通信。
2) x86/solaris
x86/solaris 9不必down/unplumb接口,可直接修改mac地址:
ifconfig dnet0 ether 00:00:00:00:00:00
全零mac地址可与同一hub上的windows系统通信。
3) windows 98/nt/2000/xp/2003
windows xp通过gui界面设置全零mac时无错误提示,但真实通信时仍然使用原mac,
"ipconfig -all"查看得到的mac地址也是原mac。
windows 98/2000/xp都可与全零mac的系统正常通信,nt/2003未测试,应该也是可以
的。
xp下mac地址在注册表中的相应位置:
hkey_local_machinesystemcurrentcontrolsetcontrolclass{4d36e972-e325-11ce-bfc1-08002be10318}
netcfginstanceid reg_sz {可变串}
networkaddress reg_sz 000000111111
4) x86/freebsd
freebsd下ifconfig修改mac地址前不必down掉相应接口,可直接修改,并且全零mac
地址与同一hub上的windows系统通信无误:
ifconfig lnc0 ether lladdr 00:00:00:00:00:00
各种系统是否接受全零mac地址是实现相关的,并不统一。注意,上述系统不但在同
一子网,而且在同一hub上。一般交换机不接受全零mac地址,导致arp解析失败,无
法获取目标mac,ip通信自然也就失败。
==============================
应该不是上面说的那样, 应该是: 环回接口
大多数的产品都支持环回接口(loopback interface),以允许运行在同一台主机上的客户程序和服务器程序通过tcp/ip进行通信。a类网络号127就是为环回接口预留的。根据惯例,大多数系统把ip地址127.0.0.1分配给这个接口,并命名为localhost。一个传给环回接口的ip数据报不能在任何网络上出现。
我们想象,一旦传输层检测到目的端地址是环回地址时,应该可以省略部分传输层和所有网络层的逻辑操作。但是大多数的产品还是照样完成传输层和网络层的所有过程,只是当ip数据报离开网络层时把它返回给自己。
阅读(1918) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~
"));
function link(t){
var href= $(t).attr('href');
href ="?url=" encodeuricomponent(location.href);
$(t).attr('href',href);
//setcookie("returnouturl", location.href, 60, "/");
}