代码先锋网 代码片段及技术文章聚合

linux socket 清空缓存区

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

 

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

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

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

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

whlie (1) {
    a=fgetc(f);
    if (feof(f)) break;

    //…

    b=fgetc(f);
    if (feof(f)) break;

    //…
}

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

void cleanBuff(SOCKET sock_conn){
    // 设置select立即返回
    timeval time_out;
    time_out.tv_sec = 0;
    time_out.tv_usec = 0;
    
    // 设置select对sock_conn的读取感兴趣
    fd_set read_fds;
    FD_ZEROS(&read_fds);
    FD_SET(sock_conn, &read_fds);

    int res = -1;
    char recv_data[2];
    memset(recv_data, 0, sizeof(recv_data));
    while(true){
        res = select(FD_SETSIZE, &read_fds, nullptr, nullptr, &time_out);
        if (res == 0) break;  //数据读取完毕,缓存区清空成功
        recv(sock_conn, recv_data, 1, 0);  //触发数据读取
    }
}

 

版权声明:本文为whatday原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/whatday/article/details/103537264

智能推荐

Python Socket编程中清空缓冲区的问题

python sokcet编程中清空socket缓冲区 服务器端代码 客户端代码 结果...

Linux 下修改socket接收缓冲区

在进行socket编程有时候可能需要修改下socket的接收缓冲区大小,这里可以使用 setsockopt 函数,但是如果需要修改的缓冲区很大(比如500MB),则还需要修改系统内核的TCP/IP参数,不然接收缓冲区大小会收到内核参数的限制,所以需要改两个地方。下面以把socket接收缓冲区修改为500MB说明一下要作的修改。 1、修改内核TCP/IP参数 在终端用sysctl命令修改socket...

Linux下socket缓冲区及阻塞模式

socket缓冲区 每个 socket 被创建后,都会分配两个缓冲区,输入缓冲区和输出缓冲区。 write()/send() 并不立即向网络中传输数据,而是先将数据写入缓冲区中,再由TCP协议将数据从缓冲区发送到目标机器。一旦将数据写入到缓冲区,函数就可以成功返回,不管它们有没有到达目标机器,也不管它们何时被发送到网络,这些都是TCP协议负责的事情。 TCP协议独立于 write()/send()...

linux 如何清空缓冲区

最近要开始做项目,但是有个缓冲区清空问题总搞不掉,解决后分享一下 一.fflush fflush 这个是确定不能用的. 因为 fflush 不是标准 c 的函数 二. setbuf(stdin,NULL) 在网上查了一下,好多人都推荐使用 setbuf.为了避免没用 ,我就做了个测试 这个测试做完以为 setbuf 真的有用,毕竟是测试了的 但是     &...

Java Socket读写缓存区Writer和Reader

Java Socket编程实例:[url]http://donald-draper.iteye.com/blog/2356695[/url] 在上一篇Java Socket编程实例,我们实战Java Socket编程中,用到 BufferedInput/OutputStream去包装Input/OutputStream读写socket的缓冲区,这种是通过 FilterInput/OutputStr...

猜你喜欢

Linux下清空缓存的办法

Writing to this will cause the kernel to drop clean caches, dentries andinodes from memory, causing that memory to become free. To free pagecache: To free dentries and inodes: To free pagecache, dentr...

linux下 redis如何清空缓存

linux下 redis如何清空缓存 1,进入redis安装目录下bin目录 2,连接redis服务端 3,选择需要清空的片区,或者整个库进行清空...

linux c socket编程

这里主要是代码,网上有原理 socket 有同步,异步之分,我这是个同步的,同步又有阻塞和非阻塞之分, 这的非阻塞是用select()函数实现的 客户端: 服务器端:...

linux socket 学习笔记

1.创建套接字:socket() int __domain:UNIX系统支持的地址族有:AF_UNIX、AF_INET、AF_NS等,而DOS、WINDOWS中仅支持AF_INET,它是网际网区域,Linux环境下AF_INET就可以了。 int __type:是一种类型,这里可以采用SOCK_STREAM int __protocol:参数protocol说明该套接字使用的特定协议,如果调用者不...