linux socket 清空缓存区

亦凉 2021-07-28 12:40 658阅读 0赞

情况一:知晓缓存区中数据的大小
这种情况应该就不用多说了,直接循环的把数据都读取出来就行了。

情况二:不知道缓存区中数据的大小

方案一
close一次socket,这个方案有效是有效,但这样的小问题还不至于如此大动干戈,因此不建议使用。

方案二
使用recv来读取,但是在阻塞模式下效率低下,因为在不知道数据的情况下,在最后一次读取的情况下需要等待到超时才会知道数据是否读取完毕。

方案三
使用fgetc,通过判断feof来确定数据时候读取完毕。

  1. whlie (1) {
  2. a=fgetc(f);
  3. if (feof(f)) break;
  4. //…
  5. b=fgetc(f);
  6. if (feof(f)) break;
  7. //…
  8. }

方案四
使用select()来实现,这个的思想其实就是巧妙的将阻塞型转化成非阻塞型,而且不需要直接改动原来的socket。(注:需要了解select中超时时间三种情况 1)

  1. void cleanBuff(SOCKET sock_conn){
  2. // 设置select立即返回
  3. timeval time_out;
  4. time_out.tv_sec = 0;
  5. time_out.tv_usec = 0;
  6. // 设置select对sock_conn的读取感兴趣
  7. fd_set read_fds;
  8. FD_ZEROS(&read_fds);
  9. FD_SET(sock_conn, &read_fds);
  10. int res = -1;
  11. char recv_data[2];
  12. memset(recv_data, 0, sizeof(recv_data));
  13. while(true){
  14. res = select(FD_SETSIZE, &read_fds, nullptr, nullptr, &time_out);
  15. if (res == 0) break; //数据读取完毕,缓存区清空成功
  16. recv(sock_conn, recv_data, 1, 0); //触发数据读取
  17. }
  18. }

发表评论

表情:
评论列表 (有 0 条评论,658人围观)

还没有评论,来说两句吧...

相关阅读

    相关 Linux 缓存

    Linux内存介绍 在Linux中经常发现空闲内存很少,似乎所有的内存都被系统占用了,表面感觉是内存不够用了,其实不然。这是Linux内存管理的一个优秀特性,在这方

    相关 java 缓存实验

    java清空缓存实验 在日常开发中我们经常用map等容器作为缓存,当程序执行完时一般都需要清除缓存,这些容器通常也提供clear方法。Java中不需要我们手动释放内存,我

    相关 linux socket 缓存

    情况一:知晓缓存区中数据的大小 这种情况应该就不用多说了,直接循环的把数据都读取出来就行了。   情况二:不知道缓存区中数据的大小 方案一 close一次sock