清空socket接收队列

在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

  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值