linux accept 如何设置超时
时间: 2023-10-13 13:10:01 浏览: 175
在 Linux 中,可以使用 `select` 或 `poll` 函数来实现 accept 超时。以下是使用 `select` 函数的示例代码:
```c
#include <sys/types.h>
#include <sys/socket.h>
#include <sys/select.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <errno.h>
int main() {
int listenfd = socket(AF_INET, SOCK_STREAM, 0);
if (listenfd < 0) {
perror("socket");
return -1;
}
int on = 1;
setsockopt(listenfd, SOL_SOCKET, SO_REUSEADDR, &on, sizeof(on));
struct sockaddr_in addr;
addr.sin_family = AF_INET;
addr.sin_port = htons(12345);
addr.sin_addr.s_addr = htonl(INADDR_ANY);
if (bind(listenfd, (struct sockaddr*)&addr, sizeof(addr)) < 0) {
perror("bind");
return -1;
}
if (listen(listenfd, 10) < 0) {
perror("listen");
return -1;
}
fd_set rfds;
FD_ZERO(&rfds);
FD_SET(listenfd, &rfds);
struct timeval tv;
tv.tv_sec = 5; // 设置超时时间为 5 秒
tv.tv_usec = 0;
int ret = select(listenfd + 1, &rfds, NULL, NULL, &tv);
if (ret == -1) {
perror("select");
return -1;
} else if (ret == 0) {
printf("select timeout\n");
return -1;
} else {
int connfd = accept(listenfd, NULL, NULL);
if (connfd < 0) {
perror("accept");
return -1;
}
// 处理连接
}
close(listenfd);
return 0;
}
```
在上面的代码中,我们使用 `select` 函数设置了一个 5 秒的超时时间,在超时时会输出 "select timeout" 并返回 -1。如果在超时时间内有连接到来,就会执行 accept 函数并返回连接的套接字。如果 accept 函数出错,会返回 -1 并打印错误信息。
阅读全文