【问题标题】:is raw socket datagram socket or not?是原始套接字数据报套接字吗?
【发布时间】:2013-06-17 08:55:48
【问题描述】:

对于非阻塞数据报套接字,如 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));

【问题讨论】:

    标签: sockets network-programming raw-sockets


    【解决方案1】:

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

    所以你必须在你的数据包中添加 UDP 头,那么它将是一个数据报套接字。

    【讨论】:

    • 它是原始套接字,因此不会涉及 TCP 堆栈。我认为对于原始套接字,TCP数据包只是一个数据包,不涉及TCP机制,不是吗?
    • 涉及机制。在 TCP 套接字的情况下,内核会为您做一些事情。看看this question
    • 啊,好的,它用于recv()/read(),因为TCP堆栈会响应一个传入的tcp数据包。但是对于 send()/write(),原始套接字与本地 tcp 堆栈无关。
    • 我认为你需要接收和发送 :) 没关系:你可以将原始套接字用作数据报套接字。
    • 所以你的意思是原始套接字,如果我用它来发送一个 tcp 数据包,它就像一个数据报套接字一样运行,对吧?
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-08-01
      • 2011-09-22
      • 1970-01-01
      • 2022-01-01
      • 2020-02-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多