请教ip协议
我想分析ip协议
我把网卡设置成混杂模式后收到了数据,但是打出来后源ip地址不对,代码如下
- C/C++ code
int promisc(){ int sp; int i; char *ethname="eth0"; char *p; char buff[2048]; struct ifreq ifr; int n = 0XFF; sp=socket(AF_INET,SOCK_PACKET,htons(0x0003)); if(sp<0) { printf("create socket error\n"); return 1; } strcpy(ifr.ifr_name, ethname); i=ioctl(sp,SIOCGIFFLAGS, &ifr); if(i<0) { printf("ioctl SIOCGIFFLAGS error\n"); return 1; } ifr.ifr_flags|=IFF_PROMISC; i=ioctl(sp,SIOCSIFFLAGS, &ifr); if(i<0) { printf("ioctl SIOCSIFFLAGS error\n"); return 1; } while(1) { recvfrom(sp, buff, sizeof(buff), 0, NULL, NULL); p=buff; printf("MAC: %.2X:%02X:%02X:%02X:%02X:%02X==>" "%.2X:%.2X:%.2X:%.2X:%.2X:%.2X\n", p[6]&n, p[7]&n, p[8]&n, p[9]&n, p[10]&n, p[11]&n, p[0]&n, p[1]&n, p[2]&n,p[3]&n, p[4]&n, p[5]&n); printf("TYPE: %02X%02X\n", p[12]&n, p[13]&n); printf("Version:%1x\n",p[14]&0xf0); printf("headlen:%1x\n",p[14]&0x0f); printf("TOS:%x\n",p[15]); printf("len:%02x%02x\n",p[16]&n,p[17]&n); printf("16bit:\n"); printf("3bit:\n"); printf("13bit:\n"); printf("TTL:%02x\n",p[22]); printf("Protocal:%02x\n",p[23]); printf("%02x%02x\n",p[24],p[25]); printf("%02x.%02x.%02x.%02x\n",p[26],p[27],p[28],p[29]); } return 0;}
[解决办法]
printf("%02x.%02x.%02x.%02x\n",0x0ff & p[26],0x0ff & p[27],0x0ff & p[28],0x0ff & p[29]);
[解决办法]
这题和IP没有关系
%x是unsigned int,你的是char(有正负)。如果是char的最高位是1,比如F1,补位后就是0xFFFFFFF1。所以要&下。
或者用unsigned char p[]