我使用以下方法设置了原始数据包套接字:
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
。那么有没有办法用上面创建的套接字设置这个选项?
非常感谢。
答案 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。