对于非阻塞数据报套接字,如UDP,当我在套接字上调用write()/ send()时,write()/ send()或read()/ recv()的每次调用都处理1个数据包
我想知道原始套接字(如下所示)是否是数据报套接字?
int on = 1;
rawfd = socket(AF_INET, SOCK_RAW, IPPROTO_RAW);
setsockopt(IPPROTO_IP, IP_HDRINCL, &on, sizeof(on));
答案 0 :(得分:2)
这取决于您将在数据包(TCP或UDP)中包含的IP头的类型。实际上,包含UDP头更容易,因为内核将管理一些TCP机制。
因此,您必须在数据包中添加UDP标头,然后它将成为数据报套接字。
答案 1 :(得分:2)
当您发送数据时,TCP / IP堆栈将添加TCP / UDP标头,IP标头,然后是以太网标头,并且网络工作卡将整个数据包传输出去。对于原始套接字,您准备所有标头(TCP / UDP,IP和MAC),并且网络工作卡将整个数据包传输出去。因此,它是否是数据报取决于您添加的标头是TCP还是UDP。