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
相关产品推荐
相关产品推荐

