Tag: ipv6

如何比较IPv6大于/小于C

使用inet_pton转换IPv4以比较它是否在IPv4范围内非常简单。 但是,我不确定如何使用inet_pton和in6_addr ,看看它是否比另一个IP更少/更大。 这就是我的想法: #include … const char *ip6str = “0:0:0:0:0:ffff:c0a8:3”; const char *first = “0:0:0:0:0:ffff:c0a8:1”; const char *last = “0:0:0:0:0:ffff:c0a8:5”; struct in6_addr result, resfirst, restlast; uint8_t ipv6[16]; // perhaps to hold the result? inet_pton(AF_INET6, first, &resfirst); inet_pton(AF_INET6, last, &reslast); inet_pton(AF_INET6, ip6str, &result); //assuming inet_pton succeed if(result.s6_addr >= resfirst.s6_addr && result.s6_addr <= reslast.s6_addr) //within range

计算C中ICMPv6包的校验和

我正在尝试计算ICMPv6消息的校验和(确切地说,是一个Neighbor Advertisement)。 RFC 4443将其描述为“整个ICMPv6消息的一个补码和的16位补码” 还有一些关于如何做到这一点的示例代码(虽然我认为它来自IPv4,但唯一的区别是总和中包含的内容,而不是如何计算它): RFC 1071 我从wireshark获取了一个数据包,并以主机字节顺序进入短路。 然后我打印正确的校验和,将其归零并计算我的。 但他们不匹配。 根据RFC 1071,endianess不应该是问题(结果不只是字节交换,而是完全关闭)。 根据RFC 2460#8.1,我需要在计算中包含“伪标头”,仅包含Src + Dst地址,长度为32位宽字段和下一个标头类型。 通话代码: uint32_t payloadlen = htonl(32); struct ip6_hdr *ip6; struct nd_neighbor_advert *na; size_t len, offset, tmplen; uint8_t *tmppacket, icmp = 58; uint8_t packet[] = { 0x60, 0x00, 0x00, 0x00, 0x00, 0x20, 0x3A, 0xFF, 0x20, 0x01, 0x0D, 0xB8, 0xDD, 0xDD, 0x00, […]

IPv6地址的正则表达式

我有一个IPv6地址的正则表达式,如下所示 IPV4ADDRESS [ \t]*(([[:digit:]]{1,3}”.”){3}([[:digit:]]{1,3}))[ \t]* x4 ([[:xdigit:]]{1,4}) xseq ({x4}(:{x4}){0,7}) xpart ({xseq}|({xseq}::({xseq}?))|::{xseq}) IPV6ADDRESS [ \t]*({xpart}(“:”{IPV4ADDRESS})?)[ \t]* 它是正确的所有格式的IPv6地址,包括 1) non-compressed IPv6 addresses 2) compressed IPv6 addresses 3) IPv6 addresses in legacy formats.(supporting IPv4) 传统格式的IPv6地址的理想示例是 2001:1234::3210:5.6.7.8 OR 2001:1234:1234:5432:4578:5678:5.6.7.8 As you can see above there are 10 groups separated by either `”:” or “.”.` 与普通IPv6地址中的8组相反。这是因为最后4组由“”组成。 应该压缩成IPv6地址的最低32位。因此我们需要10组来满足128位。 但是,如果我使用以下地址格式 2001:1234:4563:3210:5.6.7.8 这里用“:”分隔的每个组代表16位。最后四个组用“。”分隔。 […]

IPv6套接字程序问题

似乎流不会进入ipv6server.c中包含accept的“for”循环,因此无法接受并连接客户端。 是什么错误? 此代码适用于IPV4,但在IPV6更改后出现此问题 ipv6server.c #include #include /* needed for os x */ #include /* for memset */ #include #include #include /* defines ERESTART, EINTR */ #include /* defines WNOHANG, for wait() */ #include “port.h” /* defines default port */ #ifndef ERESTART #define ERESTART EINTR #endif extern int errno; void serve(int port); /* main server function […]

我可以使用pcap库接收ipv6数据包吗?

我正在尝试将hping3转换为hping6。 hping3使用Pcap库接收IPv4数据包。 但我需要接收IPv6数据包。

getifaddrs()结果发生变化时是否有通知机制?

在启动时,我的程序调用getifaddrs()来找出可用于链接本地IPv6多播的网络接口。 这样做可行,但它不处理getifaddrs()返回后可用网络接口集发生变化的情况。 当网络接口发生变化时,OS是否有某种方式通知我的程序,所以我可以再次调用getifaddrs()并更新我的列表? 或者我注定每隔几秒钟就会对getifaddrs()进行一次轮询? (注意:在Windows上,我调用GetAdaptersAddresses()而不是getifaddrs(),但是存在相同的问题)

链接范围IPv6多播数据包突然无法在MacBook Pro上路由?

这是一个有点模糊的问题,但我很难过,我想也许有人可能会对这个问题有更多的线索。 我的同事已成功运行一个内部应用程序,在他的MacBook Pro上使用IPv6多播几个月,但今天Mac决定停止路由多播数据包。 特别是,程序打印此错误: 网络接口上的SendDataUDP(ff02 :: bead:cede:deed:feed @ 4)失败[名称= [en0]描述= [] IP = [fe80 :: 222:41ff:fe21:dfd4 @ 4]网络掩码= [ffff: ffff:ffff:ffff ::] Broadcast = [::]](错误= 65 /无主机路由)。 …它很好地描述了出错的地方……它试图将UDP数据包发送到所显示的IP地址,并且发送()失败并使用errno = EHOSTUNREACH。 我不明白的是,什么可能导致IPv6链路范围多播地址“无法访问”? 如果我对链路范围组播的理解是正确的,那么数据包只需要从本地以太网端口出来(在这种情况下为en0,它在该机器上运行)。 我缺少多播的某些方面,还是他的机器只是被塞了? 他说他没有改变什么,只是神秘地停止了工作。

将套接字绑定到IPv6地址

我正在尝试编写一个侦听IPv4和IPv6地址的Web服务器。 但是,我最初写的代码不起作用。 然后我发现IPv6结构适用于IPv4和IPv6。 所以现在我使用IPv6结构,但只有IPv4地址才有效。 这篇post, 为什么我不能将ipv6 socket绑定到linklocal地址 ,后面说要添加server.sin6_scope_id = 5; 所以我这样做但它仍然不接受IPv6 telnet连接。 任何帮助将不胜感激,因为我彻底难过。 谢谢! 我的代码如下: void initialize_server(int port, int connections, char* address) { struct sockaddr_in6 socket_struct; /*Creates the socket*/ if ((sock_fd = socket(AF_INET, SOCK_STREAM, 0)) < 0) { syslog(LOG_ERR, "%s\n", strerror(errno)); exit(EXIT_FAILURE); }/*Ends the socket creation*/ /*Populates the socket address structure*/ socket_struct.sin6_family = AF_INET6; if(address […]

如何将链路本地地址绑定到ipv6套接字

这个问题可以被视为我自己发布的前一个问题的姐妹问题。 当您想要将链接本地地址绑定到IPv6套接字时,需要设置sockaddr_in6结构的sin6_scope_id字段,这非常繁琐。 我想知道是否有人可以按照良好做法提供解决方案。

测试按位IPv6网络掩码是否连续的有效方法

我需要在in_addr / in6_addr结构中存储IP地址/网络掩码。 对于IPv4,我使用以下代码来测试网络掩码是否是连续的: ((((~netmask + 1) & (~netmask)) != 0) && (netmask != 0)) 我想知道是否有一种聪明的方法可以为IPv6做同样的事情。