在linux中设置IP_HDRINCL和PF_PACKET错误

时间:2011-10-06 18:11:49

标签: c linux sockets raw-sockets

我使用以下方法设置了原始数据包套接字:

sockFd = socket(PF_PACKET, SOCK_RAW, htons(ETH_P_ALL) );

然后我尝试使用:

设置套接字选项IP_HDRINCL
int one = 1;
if (setsockopt (sockFd, IPPROTO_IP, IP_HDRINCL, &one, sizeof(one)) < 0)
    LogPrint(LOG_UNKNOWN,"Warning: Cannot set HDRINCL!\n");

但是我无法设置此选项(我收到errno 92错误消息“协议不可用”。如果我将PF_PACKET更改为PF_INET,则设置选项但是我必须使用PF_PACKET。那么有没有办法用上面创建的套接字设置这个选项?

非常感谢。

2 个答案:

答案 0 :(得分:3)

PF_PACKET套接字没有我在要设置的问题中提出的任何选项。该选项仅适用于类型为PF_INET的{​​{1}}或PF_INET6套接字。

如果想要内核添加IP头,则必须使用SOCK_RAW套接字。

答案 1 :(得分:1)

您可以执行以下操作:

int sock = socket(AF_INET, SOCK_RAW, IPPROTO_RAW);

这意味着套接字是设置了IP_HDRINCL的原始套接字。如果使用getsockopt检查套接字的值,您将看到已设置IP_HDRINCL。