开发者

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.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜