代码之家  ›  专栏  ›  技术社区  ›  Akbar294

原始套接字缓冲区

  •  0
  • Akbar294  · 技术社区  · 3 周前

    当我们使用原始套接字时,我们需要处理所有事情,包括处理我们需要处理的数据包。

    假设我收到2个10字节大小的数据包。 该数据包包含消息helloworld和helooworld。

    假设helloworld数据包是我从网络收到的第一个数据包,我们知道helloworl德数据包将被放入缓冲区。

    但在处理helloworld数据包之前,我收到了heloworld的数据包。

    缓冲区中是否有被覆盖的数据?

    示例代码:

    struct sockaddr _addr;
    socklen_t size = sizeof(_addr);
    unsigned char buffer[20];
    int fd = socket(AF_PACKET,SOCK_RAW,htons(ETH_P_ALL));
    recvfrom(fd,buffer,sizeof(buffer),0,&_addr,&size);
    

    我的问题是: 当我收到helloworld数据包时,它将被放置在索引0-9处,但在我处理helloworl德数据包之前,我也会收到helooworld数据包

    helooworld数据包会被放置在索引0-9中吗?这意味着它将覆盖之前的数据或放置在索引10-19中?

    1 回复  |  直到 3 周前
        1
  •  2
  •   0___________    3 周前

    在原始套接字和提供的代码示例的上下文中,每次调用 recvfrom 将从头覆盖缓冲区的内容(索引0),假设缓冲区大小足以容纳接收到的数据。

    为了避免数据丢失:

    • 调用recvfrom后立即处理接收到的数据。
    • 独立缓冲区:如果你想保留多个数据包,你需要在调用之前将接收到的数据复制到一个单独的缓冲区 接收数据 或者您需要将不同的缓冲区传递给 接收数据