You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Raw Socket接收多数据包时缓冲区是否被覆盖的技术问询

原始套接字接收时的缓冲区行为解答

结论:你用户态的buffer不会被提前覆盖,第二个数据包会暂存在内核的套接字接收队列中,直到你再次调用接收函数。

具体逻辑如下:

  • 第一个"helloworld"数据包到达后,会被内核存入该原始套接字的接收队列,此时你的用户态buffer还没有任何数据。
  • 当你调用recvfrom()时,内核才会把队列里的第一个数据包拷贝到你指定的buffer起始位置(0-9索引)。
  • 在你处理这个数据包、未再次调用recvfrom()之前,后续收到的"helooworld"数据包只会被内核追加到接收队列末尾,不会触碰你用户态的buffer。
  • 只有当你再次调用recvfrom()时,内核才会把队列里的下一个数据包("helooworld")拷贝到buffer的0-9索引位置,这时候才会覆盖之前的"helloworld"数据。

你的示例代码:

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);

补充说明:

  • 用户态缓冲区的写入完全由recvfrom()这类接收函数触发,每次调用仅处理一个数据包,不会自动将多个数据包拼接进同一个buffer。
  • 即使你的buffer大小大于单个数据包长度,内核也只会把当前处理的数据包写入buffer起始位置,剩余空间不会被填充后续数据包内容。

内容的提问来源于stack exchange,提问作者Akbar294

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.15 00:01:05