If I print out the header field values of the IP header sent on a the RAW socket with the following parameters and default settings, I see that the protocol number is set to ‘2’ which belongs to that of IGMP.
sock = socket(PF_INET, SOCK_RAW, AF_INET);
However, if I access the packet using TCP header, I get good values for most of the fields, except that data offset gets a wrong value. Also, I am not able to read the header correctly using IGMP headers on the Linux platform (Ubuntu).
For reading out the 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);
This gives me error for IGMP Packet:
error: dereferencing pointer to incomplete type
For all 4 fields.
If I treat it as TCP header, it works fine.
I am using RAW socket to communicate between a daemon and a CLI as its management agent.
I think you’ve seriously failed to understand what raw sockets are for. They’re a tool to let you manually assemble or inspect the contents of IP packets, including the higher-level headers inside the IP packet that tell whether it’s TCP, UDP, ICMP, IGMP, etc. They are not a means of communication to be used directly, but a means to hack around with existing higher-level means of communication at a lower level.
For your application you almost certainly want TCP or UDP sockets.