Set IP_HDRINCL with PF_PACKET error in linux
I setup a raw Packet socket using the following:
sockFd = socket(PF_PACKET, SOCK_RAW, htons(ETH_P_ALL) );
Then I am trying to set the socket option IP_HDRINCL using:
int one = 1;
if (setsockopt (sockFd, IPPROTO_IP, IP_HDRINCL, &one, sizeof(one)) < 0)
LogPrint(LOG_UNKNOWN,"Warning: Cannot set HDRINCL!\n");
But I am unable to set this option (I get an error with errno 92 and message "Protocol not available". If I change PF_PACKET to PF_INET then the options is set but I have to use PF_PACKET. So is the开发者_StackOverflowre a way to set this option with the socket created above?
Thanks a bunch.
PF_PACKET sockets don't have any option that I asked in the question to be set. That option is only available on PF_INET or PF_INET6 sockets with type SOCK_RAW.
If one wants the IP headers to be added by the kernel, the one must use the PF_INET socket.
You can do as following instead:
int sock = socket(AF_INET, SOCK_RAW, IPPROTO_RAW);
It implies that a socket is a raw socket with IP_HDRINCL set. If you use getsockopt to check the value of the socket, you will see IP_HDRINCL is already set.
加载中,请稍侯......
精彩评论