基本上,
read
调用尝试读取数据,因此如果您不想在其上卡住,您需要将
sock
变量声明为非阻塞或使用带有超时的
select
函数(
man select
)。在第一种情况下,您不能等待几秒钟,但可以尝试读取
k
次,然后继续。这是非阻塞套接字的示例:
#include <errno.h>
#include <fcntl.h>
#include <unistd.h>
int r1;
int flags = fcntl(sock, F_GETFL, 0);
fcntl(sock, F_SETFL, flags | O_NONBLOCK);
errno = 0;
if((r1=read(sock,buf_in,N))== -1) {
if(errno != EAGAIN && errno != EWOULDBLOCK){
perror("Error in read\n");
exit(EXIT_FAILURE);
}
}
这是一个选择解决方案:
#include <errno.h>
#include <fcntl.h>
#include <unistd.h>
#include <sys/select.h>
#define SVC(r,c,e) \
errno = 0; \
if((r=c)==-1) { perror(e);exit(errno); }
int r = 0;
int fd_skt;
fd_set rdset;
fd_set set;
struct timeval tv;
int fd_num_max = 0;
if(fd_skt > fd_num_max) fd_num_max = fd_skt;
FD_ZERO(set);
FD_SET(fd_skt,set);
tv.tv_sec = 0;
tv.tv_usec = 200*1000;
rdset = set;
SVC(r,select((fd_num_max+1),(&rdset),NULL,NULL,&tv),"Unable to select\n");
n = read(sock, buffer);
这行代码表示从套接字(socket)中读取数据,并将结果存储在缓冲区(buffer)中,读取的字节数将被赋值给变量n。read()函数有三个参数。 - Andrew Henle