linux socket 清空缓存区

前提是你 提交于 2019-12-14 21:35:19

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

 

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

方案一
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);  //触发数据读取
    }
}

 

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!