1
socket(AF_INET, SOCK_RAW, IPPROTO_RAW);
linux手册页说明了这段代码。
在socket选项中,如果设置了IP_HDRINCL,我可以创建IP头。我对吗? 如果它是正确的,那么套接字上面也让我也可以创建TCP头文件了吗?
然后,如果没有设置IP_HDRINCL,那么套接字上面是什么意思?
2
socket(AF_INET, SOCK_RAW, IPPROTO_TCP);
socket(AF_INET, SOCK_RAW, IPPROTO_UDP);
上面的代码与1号问题的代码相比意味着什么?
我知道IPPROTO_RAW无法接收任何IP数据包。在这里,这些套接字只能接收TCP数据包,每个接收UDP pakcets。(我能看到IP报头,以太网报头吗?) 但发送怎么样?我不知道这件事。
答案 0 :(得分:3)
IP_HDRINCL表示:我希望我的数据(发送和recv)包含ip hdr。如果你的数据包含ip hdr,则意味着tcp hdr跟随(就在ip hdr之后),最后是应用程序的消息(你通常给发送的消息......)。如果没有IP_HDRINCL,您只能访问应用数据。
是的,IPPROTO_TCP和IPPROTO_UDP与SOCK_RAW一样只是过滤器,用于发送和接收。使用IPPROTO_RAW能够发送任何TCP / IP数据包(无过滤器)。但是要接收数据包,您还需要将AF_INET更改为AF_PACKET。