5

for non-blocking datagram socket, like UDP, when I call write()/send() on the socket, each call of write()/send() or read()/recv() deal with exactly 1 packet.

I'm wondering if raw socket, like the below, is a datagram socket or not?

int on = 1;
rawfd = socket(AF_INET, SOCK_RAW, IPPROTO_RAW);
setsockopt(IPPROTO_IP, IP_HDRINCL, &on, sizeof(on));
4

2 回答 2

2

这取决于您将包含在数据包中的 IP 标头类型(TCP 或 UDP)。实际上,包含 UDP 标头更容易,因为内核将管理一些 TCP 机制。

因此,您必须在数据包中添加 UDP 标头,然后它将是一个数据报套接字。

于 2013-06-17T09:22:08.990 回答
2

当您发送数据时,TCP/IP 堆栈会添加 TCP/UDP 头、IP 头和以太网头,网络工作卡将整个数据包发送出去。对于原始套接字,您准备好所有标头(TCP/UDP、IP 和 MAC),然后网络工作卡将整个数据包传输出去。所以是否是数据报取决于您添加的标头是TCP还是UDP。

于 2013-09-09T01:50:37.723 回答