免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1577 | 回复: 3
打印 上一主题 下一主题

[网络] 原始套接字输出问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2014-05-16 18:49 |只看该作者 |倒序浏览
/***************SimpelSniffer.c*************/
//auther:duanjigang@2006s
#include <stdio.h>
#include <unistd.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <linux/if_ether.h>
#include <linux/in.h>
#define BUFFER_MAX 2048

int main(int argc, char *argv[])
{
        
        int sock, n_read, proto;        
        char buffer[BUFFER_MAX];
        char  *ethhead, *iphead, *tcphead,
                         *udphead, *icmphead, *p;
        
if((sock = socket(PF_PACKET, SOCK_RAW, htons(ETH_P_IP))) < 0)
    {
        fprintf(stdout, "create socket error\n";
        exit(0);
    }
        
while(1)
{
     n_read = recvfrom(sock, buffer, 2048, 0, NULL, NULL);
        /*
        14   6(dest)+6(source)+2(type or length)
        +
        20   ip header
        +
        8   icmp,tcp or udp header
        = 42
        */
if(n_read < 42)
   {
      fprintf(stdout, "Incomplete header, packet corrupt\n";
      continue;
   }
               
        ethhead = buffer;
        p = ethhead;
        int n = 0XFF;
                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);

                   iphead = ethhead + 14;  
                   p = iphead + 12;
        
           printf("IP: %d.%d.%d.%d => %d.%d.%d.%d\n",
           p[0]&0XFF, p[1]&0XFF, p[2]&0XFF, p[3]&0XFF,
           p[4]&0XFF, p[5]&0XFF, p[6]&0XFF, p[7]&0XFF);
            proto = (iphead + 9)[0];
            p = iphead + 20;
             printf("rotocol: ";
            switch(proto)
              {
                case IPPROTO_ICMP: printf("ICMP\n";break;
                case IPPROTO_IGMP: printf("IGMP\n";break;
                case IPPROTO_IPIP: printf("IPIP\n";break;
                case IPPROTO_TCP :
                case IPPROTO_UDP :
    printf("%s,", proto == IPPROTO_TCP ? "TCP": "UDP";
    printf("source port: %u,",(p[0]<<&0XFF00 |  p[1]&0XFF);
    printf("dest port: %u\n", (p[2]<<&0XFF00 | p[3]&0XFF);
         break;
    case IPPROTO_RAW : printf("RAW\n";break;
    default:printf("Unkown, please query in include/linux/in.h\n";
        }
   }
}

为什么输出mac地址的时候 需要进行&操作啊? p[i]不就是表示该字节的值,但是我试了下不进行&操作的话 输出mac地址的时候会出错
????
哎 输入输出一直掌握不好

论坛徽章:
5
处女座
日期:2014-10-15 11:57:302015年亚洲杯之中国
日期:2015-03-04 17:05:552015亚冠之西悉尼流浪者
日期:2015-07-31 12:14:2915-16赛季CBA联赛之同曦
日期:2015-12-10 18:14:0615-16赛季CBA联赛之北京
日期:2016-07-07 17:01:53
2 [报告]
发表于 2014-06-10 17:21 |只看该作者
回复 1# bjutslg
你定义的是char *p。
输出时会做扩展,要么格式化时使用%02hhx,要么定义成unsigned char *p;

   

论坛徽章:
0
3 [报告]
发表于 2014-06-11 11:44 |只看该作者
不是很明白啊 能给详细说说么回复 2# zhanglin496


   

论坛徽章:
0
4 [报告]
发表于 2014-06-14 13:30 |只看该作者
恩 明白了 原来是符号为扩展的问题!回复 2# zhanglin496


   
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP