gpt4 book ai didi

c - socket(PF_INET, SOCK_RAW, AF_INET) 使用 IGMP?

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:09:15 26 4
gpt4 key购买 nike

如果我使用以下参数和默认设置打印出在 RAW 套接字上发送的 IP header 的 header 字段值,我看到协议(protocol)号设置为“2”,属于 IGMP。

 sock = socket(PF_INET, SOCK_RAW, AF_INET); 

但是,如果我使用 TCP header 访问数据包,我会得到大部分字段的正确值,除了数据偏移量得到错误的值。此外,我无法在 Linux 平台 (Ubuntu) 上使用 IGMP header 正确读取 header 。

读出标题:

printf("\n");
printf("IP Header\n");
printf(" |-IP Version : %d\n",(unsigned int)iph->version);
printf(" |-IP Header Length : %d DWORDS or %d Bytes\n",(unsigned int)iph->ihl, ((unsigned int)(iph->ihl))*4);
printf(" |-Type Of Service : %d\n",(unsigned int)iph->tos);
printf(" |-IP Total Length : %d Bytes(Size of Packet)\n",ntohs(iph->tot_len));
printf(" |-Identification : %d\n",ntohs(iph->id));
printf(" |-TTL : %d\n",(unsigned int)iph->ttl);
printf(" |-Protocol : %d\n",(unsigned int)iph->protocol);
printf(" |-Checksum : %d\n",ntohs(iph->check));
printf(" |-Source IP : %s\n",inet_ntoa(source.sin_addr));
printf(" |-Destination IP : %s\n",inet_ntoa(dest.sin_addr));

// IGMP Print
printf("\n");
printf("IGMP Header\n");
printf(" |-IGMP Type : %d\n",(unsigned int)head->igmp_type);
printf(" |-IGMP Code : %d\n",(unsigned int)head->igmp_code);
printf(" |-IGMP Checksum : %d\n",(unsigned int)head->igmp_cksum);
printf(" |-IGMP Address : %s\n",inet_ntoa(head->igmp_group.sin_addr);

这给我错误的 IGMP 数据包:

error: dereferencing pointer to incomplete type

对于所有 4 个字段。

如果我把它当作 TCP 头,它工作正常。

我正在使用 RAW 套接字作为其管理代理在守护进程和 CLI 之间进行通信。

最佳答案

我认为您严重未能理解原始套接字的用途。它们是一种工具,可让您手动组装或检查 IP 数据包的内容,包括 IP 数据包中的高级 header ,这些 header 可以判断它是 TCP、UDP、ICMP、IGMP 等。它们不是一种手段直接使用通信,而是一种在较低级别对现有的较高级别通信方式进行破解的手段。

对于您的应用程序,您几乎肯定需要 TCP 或 UDP 套接字。

关于c - socket(PF_INET, SOCK_RAW, AF_INET) 使用 IGMP?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8936709/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com