利用netfilter抓到的包,怎么输出ipv6地址?

lanqiucoco 2012-05-10 02:31:47
如题,在网上找了一个例子:
srcaddr = &ipv6h->saddr;
dstaddr = &ipv6h->daddr;

printk("Packet for source address: %X:%X:%X:%X:%X:%X:%X:%X\n",NIPV6ADDR(srcaddr));
printk("Packet for destination address: %X:%X:%X:%X:%X:%X:%X:%X\n",NIPV6ADDR(dstaddr));

编译的时候说NIPV6ADDR没有定义。改成IPV6ADDR也不行。在线等谢谢!
...全文
201 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
smallbear_2008 2012-05-12
  • 打赏
  • 举报
回复
NIPV6ADDR 不会是做 字节序转换吧?自己写一个函数就好了,就是移位和位操作而已
qq120848369 2012-05-12
  • 打赏
  • 举报
回复
抓的包本来就是网络序的,先拿到struct sockaddr_in6,然后得到sockaddr_in6.sin6_addr,传入到inet_ntop就可以得到这个地址了。

或者你自己写个宏,也就是你给出的那个NIPV6ADDR(srcaddr),它的作用是传入一个sockaddr_in6.sin6_addr,打印出IPV6字符串。

楼主是说IPV4映射的IPV6还是本身就是IPV6???? 看你打印了8个字节,IPV6不是16字节么?

方法很简单,代码如下,假设你拥有以下变量:

struct sockaddr_in6 *addr = From netfilter;
const void *src = (const void*)&addr->sin6_addr;

那么,可以定义一个宏,接受src,如下:
#define _NIPV6ADDR(ip) ip[0], ip[1], ip[2], ip[3], ip[4], ip[5], ip[6] ...
#define NIPV6ADDR(ip) _NIPV6ADDR((const char*)ip)


简单代码如下:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define _NIPV6ADDR(ip) (ip)[0], (ip)[1]
#define NIPV6ADDR(ip) _NIPV6ADDR((const unsigned char*)ip)

int main(int argc, char* const argv[]) {
char buf[] = {1, 2};
printf("%x %x\n", NIPV6ADDR(buf));
return 0;
}

如果希望得到IPV4映射的IPV6,那么低12字节是0,最后4字节是IPV4的网络序,自己写宏去实现即可。

4,441

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 内核源代码研究区
社区管理员
  • 内核源代码研究区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧