3

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

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");

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

谢谢一堆。

4

2 回答 2

3

PF_PACKET套接字没有我在要设置的问题中提出的任何选项。该选项仅适用于PF_INETPF_INET6类型为 的套接字SOCK_RAW

如果希望内核添加 IP 标头,则必须使用PF_INET套接字。

于 2011-11-16T04:49:37.350 回答
2

您可以改为执行以下操作:

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

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

于 2013-12-01T01:25:29.550 回答