打印IP地址以及网络数据包的方式
2013-08-08 10:06
417 查看
打印网络数据包的方式
if (skb && skb->input_dev && (skb->srcPhyPort == 4))
{
char *buf = skb->data;
int len = skb->len;
int i;
printk("[%s:%d]Packet length = %#4x\n", __FUNCTION__, __LINE__, len);
for (i = 0; i < len; i++){
if (i % 16 == 0) printk("%#4.4x", i);
// 打印行号
if (i % 2 == 0) printk(" ");
// 给每个数字之间添加一个空格
printk("%2.2x", ((unsigned char *)buf)[i]);
// 打印一个字节的数字
if (i % 16 == 15) printk("\n");
// 每行只存放15个数字,超过15个就换行
}
printk("\n\n\n\n");
}
在内核中打印IP地址(收到的网络数据包的IP地址是网络字节序的,网络字节序是以大端格式存放的):
#define NIPQUAD(addr) \
((unsigned char *)&addr)[0], \
((unsigned char *)&addr)[1], \
((unsigned char *)&addr)[2], \
((unsigned char *)&addr)[3]
#define NIPQUAD_FMT "%u.%u.%u.%u"
printk("masq_inet_event:(%s): %u.%u.%u.%u, errno=%d\n", "add_natip",
NIPQUAD(ina->ifa_local), rc);
// 想想为什么宏打印是从位置0开始打印,先从位置3开始打印会是怎么样
在内核中打印MAC地址的方式
在内核协议栈中dev_queue_xmit函数中获取传入数据包得报文信息:
struct iphdr * iph;
struct tcphdr *tcph;
unsigned char src_eth_addr[ETH_ALEN],dst_eth_addr[ETH_ALEN];
struct ethhdr *oeth;
__be32 src_addr,dst_addr;
__be16 src_port,dst_port;
u32 tcplen;
iph = ip_hdr(skb);
if (skb->mac_header != NULL)
{
oeth = (struct ethhdr *)skb->mac_header;
memcpy( src_eth_addr, oeth->h_source, ETH_ALEN );
memcpy( dst_eth_addr, oeth->h_dest, ETH_ALEN );
printk("sport=%d dport=%d\n",src_port,dst_port);
printk("srcmac=%02x02x%02x%02x%02x%02x dstmac=%02x%02x%02x%02x%02x%02x",
src_eth_addr[0],src_eth_addr[1],src_eth_addr[2],src_eth_addr[3],
src_eth_addr[4],src_eth_addr[5],dst_eth_addr[0],dst_eth_addr[1],
dst_eth_addr[2],dst_eth_addr[3],dst_eth_addr[4],dst_eth_addr[5]);
}
tcph = (struct tcphdr *)((u_int32_t *)iph + iph->ihl);
dst_addr = iph->daddr;
src_addr = iph->saddr;
printk("src_addr=%08x dst_addr=%08x",src_addr,dst_addr);
// tcp
src_port = tcph->source;
if (skb && skb->input_dev && (skb->srcPhyPort == 4))
{
char *buf = skb->data;
int len = skb->len;
int i;
printk("[%s:%d]Packet length = %#4x\n", __FUNCTION__, __LINE__, len);
for (i = 0; i < len; i++){
if (i % 16 == 0) printk("%#4.4x", i);
// 打印行号
if (i % 2 == 0) printk(" ");
// 给每个数字之间添加一个空格
printk("%2.2x", ((unsigned char *)buf)[i]);
// 打印一个字节的数字
if (i % 16 == 15) printk("\n");
// 每行只存放15个数字,超过15个就换行
}
printk("\n\n\n\n");
}
在内核中打印IP地址(收到的网络数据包的IP地址是网络字节序的,网络字节序是以大端格式存放的):
#define NIPQUAD(addr) \
((unsigned char *)&addr)[0], \
((unsigned char *)&addr)[1], \
((unsigned char *)&addr)[2], \
((unsigned char *)&addr)[3]
#define NIPQUAD_FMT "%u.%u.%u.%u"
printk("masq_inet_event:(%s): %u.%u.%u.%u, errno=%d\n", "add_natip",
NIPQUAD(ina->ifa_local), rc);
// 想想为什么宏打印是从位置0开始打印,先从位置3开始打印会是怎么样
在内核中打印MAC地址的方式
在内核协议栈中dev_queue_xmit函数中获取传入数据包得报文信息:
struct iphdr * iph;
struct tcphdr *tcph;
unsigned char src_eth_addr[ETH_ALEN],dst_eth_addr[ETH_ALEN];
struct ethhdr *oeth;
__be32 src_addr,dst_addr;
__be16 src_port,dst_port;
u32 tcplen;
iph = ip_hdr(skb);
if (skb->mac_header != NULL)
{
oeth = (struct ethhdr *)skb->mac_header;
memcpy( src_eth_addr, oeth->h_source, ETH_ALEN );
memcpy( dst_eth_addr, oeth->h_dest, ETH_ALEN );
printk("sport=%d dport=%d\n",src_port,dst_port);
printk("srcmac=%02x02x%02x%02x%02x%02x dstmac=%02x%02x%02x%02x%02x%02x",
src_eth_addr[0],src_eth_addr[1],src_eth_addr[2],src_eth_addr[3],
src_eth_addr[4],src_eth_addr[5],dst_eth_addr[0],dst_eth_addr[1],
dst_eth_addr[2],dst_eth_addr[3],dst_eth_addr[4],dst_eth_addr[5]);
}
tcph = (struct tcphdr *)((u_int32_t *)iph + iph->ihl);
dst_addr = iph->daddr;
src_addr = iph->saddr;
printk("src_addr=%08x dst_addr=%08x",src_addr,dst_addr);
// tcp
src_port = tcph->source;
相关文章推荐
- 网络层—IP地址的三种分类方式
- 2009年最流行的网络接入方式 以及收费
- IO的阻塞与非阻塞、同步与异步以及Java网络IO交互方式
- VMware虚拟机的三种网络连接方式以及主机向虚拟机发送文件的实现
- 在Unity中判断当前网络连接方式以及连接状态
- 二叉树的七种遍历方式以及按行打印
- 移动端打印输出内容以及网络请求-vconsole.js
- ISCSI实现磁盘网络共享以及LVM方式共享拓展
- linux下关闭printk打印信息以及通过网络查看方法
- centos7设置默认启动方式以及设置默认启动网络
- 网络攻击知识之几种IP地址攻击方式
- 网络-数据包在路由转发过程中MAC地址和IP地址,变与不变
- IO的阻塞与非阻塞、同步与异步以及Java网络IO交互方式(转)
- Android中发起网络访问的方式,以及Json、Gson的网络解析
- 24Linux-yum在线管理,IP地址配置以及网络yum源
- IP地址、子网掩码、网络号、主机号、网络地址、主机地址以及ip段
- Linux网络服务和网络配置文件以及IP地址相关的解释
- 网络请求发送不过去,找错用抓包:wireshark捕获指定ip地址数据包
- 查看局域网内某个ip地址对应的mac地址以及开启的网络端口服务命令