在socket建立时,linux的内核会为socket分配一个发送缓冲区和一个接收缓冲区,实际上是一个struct sk_buff的队列,当我们调用send/sendto/sendmsg及recv/recvfrom/recvmsg时,会发送或接收队列中的第一个数据。
现在我们只考虑接收的情况,如果甲一直不停的向乙发送消息,而乙中每次调用recv/recvfrom/recvmsg都想得到最新的数据,怎么办?
这就需要我们对linux的缓冲区进行清空。而缓冲区是在内核中的,不允许直接操作。还好,有两个函数可以解决这个问题。
第一个是int setsockopt(int socket, int level, int option_name, const void *option_value, socklen_t option_len), 他是对
socket的设置。我们可以通过它修改接收缓冲区的大小。他还有很多功能,见man setsockopt.
int lLen, lRet
lRet = setsockopt(sock, SOL_SOCKET, SO_RCVBUF, &lLen, sizeof(int));
sock就是我们创建的socket 的描述符。
如果对linux内核代码进行研究,会发现lLen不是设置成所有的值都有效。
if (val > sysctl_rmem_max)
val = sysctl_rmem_max;
set_rcvbuf:
sk->sk_userlocks |= SOCK_RCVBUF_LOCK;
/* FIXME: is this lower bound the right one? */
if ((va