今天遇到一个要求,套接字连上之后,由于在recv数据时就阻塞住了,一般会要求等待5s之后假如超时就返回失败,通过select实现了一下要求:
#define BUF_SIZE 128
#define RESPONSE_TIMEOUT 5
int ReciveResponse(int sfd, void *out_receive_data, int receive_data_size) {
if (!out_receive_data || receive_data_size == 0) {
perror("No data to read!");
return 0;
}
char *receive_buf = (char *)out_receive_data;
fd_set readfds;
struct timeval tv;
int selectRt;
int bytes = 0;
FD_ZERO(&readfds);
FD_SET(sfd, &readfds);
tv.tv_sec = 1;
tv.tv_usec = 5000;
time_t start = time(NULL);
while (time(NULL) - start < RESPONSE_TIMEOUT) {
selectRt = select(sfd + 1, &readfds, NULL, NULL, &tv);
if (-1 == selectRt) {
perror("Select failed to open!");
break;
} else if (0 == selectRt) {
continue;
} else {
if (-1 == (bytes = recv(sfd, out_receive_data, sizeof(out_receive_data), 0))) {
perror("recv failed!");
break;
}
receive_buf[bytes] = 0;
}
}
return bytes;
}