背景:
在使用recv(int sockfd, void *buf, size_t len, int flags)获取socket数据时,对其中的flags产生了疑惑
我的程序关键信息如下:
m_isock = socket(AF_INET, SOCK_RAW, IPPROTO_TCP); //获取链路层的原生信息
while(true)
{
...//一些声明、定义
t_tmppack.len = recv(m_isock, tmpbuf, CHAR_LEN, m_iFlags);//用recv获取数据
...//后续处理
}
关于m_iFlags的讨论:
m_iFlags可以设置7个标志,详见
https://man7.org/linux/man-pages/man2/recv.2.html。
在这里,我主要想请教MSG_PEEK这个标志位。
MSG_PEEK的解释是:
This flag causes the receive operation to return data from
the beginning of the receive queue without removing that
data from the queue. Thus, a subsequent receive call will
return the same data.
问题:
MSG_PEEK的作用范围是什么(和进程空间、用户空间、网络情况有没有关系)?比如MSG_PEEK设置为false,是不是本用户的其他进程就收不到socket数据了?或者本进程的其他recv收不到数据了?
我的猜想:
我测试了一下,在设置flags为0时,不影响其他进程(不管是不是当前用户)接收socket数据,但是本进程的其他recv会受到影响;
在设置flags为2时,本进程的所有recv会一直收到重复数据。
所以我的推论是,MSG_PEEK只会作用于当前进程,即使是false,Linux也不会真正地清除socket缓存。 不知道我的推论是否严谨,在网上没找想要的解释,所以上线之前还是想来确认一下(或者朋友们给一些验证思路)
--
修改:wuzhiqiu1 FROM 1.202.114.*
FROM 60.247.90.*