Tag: icmp

计算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, […]

创建PING程序时限制ICMP回应

我正在编写一个multithreadingping程序。 我在每个线程上创建了rawsockets(对于每个IP),并使用sendto()向每个线程发送ICMP Echo Request,然后在每个线程中执行recvfrom()。 我从各种套接字的IP中获取消息(如果我使用套接字S1用于IP1的sendto,我从IP1到S1,S2等回复回复)。 我需要做绑定吗? 另一个问题是,即使我只发送1个ICMP请求,我也会收到许多来自目标的回应回复。 有什么办法可以限制吗? 这导致我错过了一些其他ICMP数据包。 我的程序有没有办法让目标停止发送ICMP echo? 谢谢,

发送ICMP ping

对于ICMP ping请求(echo请求),我是否需要获取目标的MAC地址? 我试图学习如何使用原始套接字在C中实现它,但无法理解如何获取目标的MAC地址。 任何帮助表示赞赏。 谢谢。

C套接字发送UDP并处理来自路由器的ICMP应答

我正在尝试将UDP数据包发送到路由器,其生存时间为1,然后接收ICMP超时回复。 到目前为止,我能够发送数据包,但是当我的程序进入执行的recv部分时,它就会挂起。 我有一个错误检查recvfrom,但它甚至没有达到。 我的电脑正在接收请求。 我知道这是因为我在运行程序时运行Wireshark并且我过滤了ICMP请求。 每次我运行程序时,都会收到回复。 我在recvfrom上做错了什么? #include #include #include #include #include #include #include #include #define UNSPEC_PROTO 0 int main(int argc, const char *argv[]) { if (argc != 2) { printf(“usage: routetracer \n”); return -1; } struct addrinfo hints; //params for ret val of getaddrinfo struct addrinfo* ret; //return value of getaddrinfo struct sockaddr* reply_addr; […]

在C程序中发送ICMP数据包

我正在尝试在C中创建一个ICMP ping测试程序,但是在成功发送数据包时遇到了困难。 sendto函数返回字节数和所有内容但实际上没有发送数据包。 我已经在目标计算机上使用WireSharkvalidation了这一点。 主机上的常规ping工作正常,但在WireShark中显示。 这是我的代码: #include #include #include #include #include #include #include #include #include #include #include #include #include unsigned short cksum(unsigned short *addr, int len); int main(int argc, char *argv[]) { int sock; char send_buf[400], recv_buf[400], src_name[256], src_ip[15], dst_ip[15]; struct ip *ip = (struct ip *)send_buf; struct icmp *icmp = (struct icmp *)(ip + […]