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

时间:2012-01-20 04:22:44

标签: c linux sockets

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

 sock = socket(PF_INET, SOCK_RAW, AF_INET); 

但是,如果我使用TCP标头访问数据包,我会获得大多数字段的良好值,但数据偏移量的值不正确。此外,我无法在Linux平台(Ubuntu)上使用IGMP标头正确读取标头。

读出标题:

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之间进行通信作为其管理代理。

1 个答案:

答案 0 :(得分:1)

我认为你真的很难理解原始套接字的用途。它们是一种工具,可以让您手动组装或检查IP数据包的内容,包括IP数据包内的更高级别的标头,告知它是TCP,UDP,ICMP,IGMP等。它们不是一种手段通信直接使用,但是用较低层次的现有高级通信手段进行破解。

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