情况一:知晓缓存区中数据的大小
这种情况应该就不用多说了,直接循环的把数据都读取出来就行了。
情况二:不知道缓存区中数据的大小
方案一
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); //触发数据读取
}
}
来源:CSDN
作者:whatday
链接:https://blog.csdn.net/whatday/article/details/103537264