您的位置:首页 > 理论基础 > 计算机网络

使用PF_PACKET和SOCK_DGRAM探测网络包

2014-06-26 10:58 645 查看
经过以下四篇:
使用dev_add_pack注册新的以太网类型

使用PF_PACKET和SOCK_RAW发送自定义type以太网数据包

使用PF_PACKET和 SOCK_RAW探测网络包

Linux内核packet_rcv代码分析

发现,这篇 使用PF_PACKET和 SOCK_RAW探测网络包 可以更简单的捕捉我们自定义的数据包,使用SOCK_DGRAM。

因此有了此篇姐妹篇:使用PF_PACKET和SOCK_DGRAM探测网络包

上码分析:

#include <stdio.h>

#include <errno.h>

#include <unistd.h>

#include <sys/socket.h>

#include <sys/types.h>

#include <linux/in.h>

#include <linux/if_ether.h>

#include <stdlib.h>

int main(int argc, char **argv) {

int sock, n;

char buffer[2048];

unsigned char *data, *ethhead;

// if ( (sock=socket(PF_PACKET, SOCK_RAW,

// htons(0x8874)))<0) {

if ( (sock=socket(PF_PACKET, SOCK_DGRAM, //SOCK_DGRAM是过滤的L2的数据头

htons(0x8874)))<0) {

perror("socket");

exit(1);

}

while (1) {

printf("----------\n");

n = recvfrom(sock,buffer,2048,0,NULL,NULL);//读取时buffer直接只剩下数据了,不需要像SOCK_RAW一样跳过L2的数据头

printf("%d bytes read\n",n);

if (n<42) {

perror("recvfrom():");

printf("Incomplete packet (errno is %d)\n",

errno);

close(sock);

exit(0);

}

/*

ethhead = buffer;

printf("Source MAC address: "

"%02x:%02x:%02x:%02x:%02x:%02x\n",

ethhead[0],ethhead[1],ethhead[2],

ethhead[3],ethhead[4],ethhead[5]);

printf("Destination MAC address: "

"%02x:%02x:%02x:%02x:%02x:%02x\n",

ethhead[6],ethhead[7],ethhead[8],

ethhead[9],ethhead[10],ethhead[11]);

printf("%x%x\n", ethhead[12],ethhead[13]);

data=buffer+14;

printf("%s\n",data);

*/

printf("%s\n",buffer);

}

}

网络编程还是挺有意思。。。。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐