gpt4 book ai didi

c - c 中使用轮询的套接字连接超时

转载 作者:行者123 更新时间:2023-12-03 11:52:22 25 4
gpt4 key购买 nike

我有一个现有的多线程应用程序,它使用阻塞 connect() 调用。

但是,我想为应用程序引入连接超时,如果服务器在 x 毫秒内没有响应我们的查询,应用程序将停止尝试并给出错误。

但是,我无法弄清楚如何使用投票来做到这一点。

@caf 使用 select 的非阻塞连接有很大帮助。 但是与轮询相比,我阅读了该选择的速度较慢,因此我想使用轮询。你能告诉我这是真的吗?

我正在粘贴他来自 the post 的代码这里

int main(int argc, char **argv) {
u_short port; /* user specified port number */
char *addr; /* will be a pointer to the address */
struct sockaddr_in address; /* the libc network address data structure */
short int sock = -1; /* file descriptor for the network socket */
fd_set fdset;
struct timeval tv;

if (argc != 3) {
fprintf(stderr, "Usage %s <port_num> <address>\n", argv[0]);
return EXIT_FAILURE;
}

port = atoi(argv[1]);
addr = argv[2];

address.sin_family = AF_INET;
address.sin_addr.s_addr = inet_addr(addr); /* assign the address */
address.sin_port = htons(port); /* translate int2port num */

sock = socket(AF_INET, SOCK_STREAM, 0);
fcntl(sock, F_SETFL, O_NONBLOCK);

connect(sock, (struct sockaddr *)&address, sizeof(address));

FD_ZERO(&fdset);
FD_SET(sock, &fdset);
tv.tv_sec = 10; /* 10 second timeout */
tv.tv_usec = 0;

if (select(sock + 1, NULL, &fdset, NULL, &tv) == 1)
{
int so_error;
socklen_t len = sizeof so_error;

getsockopt(sock, SOL_SOCKET, SO_ERROR, &so_error, &len);

if (so_error == 0) {
printf("%s:%d is open\n", addr, port);
}
}

close(sock);
return 0;

}

你能帮我使用 poll 编写类似的功能吗?

我在 RHEL 上并使用 gcc 4.5.x 版本。

更新:对于当前代码,一旦应用程序创建到服务器的连接,如何将套接字更改为阻塞模式。我无法找到取消设置此 O_NONBLOCK 的方法。
更新 2: fcntl(sockfd, F_SETFL, fcntl(sockfd, F_GETFL) & ~O_NONBLOCK); One post已经指出我们可以用上面的命令来做到这一点。虽然没有得到登录。

最佳答案

如果只有几个文件描述符被轮询,则 select() 和 poll() 相对于其他依赖于系统的轮询 API 的性能是等效的。它们的扩展性都很差,但是当程序只收听几个 fds 时可以表现得很好。

其他特定于系统的轮询 API 的一个优势往往是它们将关联的状态推送到内核中,以便每个轮询系统调用不需要从用户空间到内核空间的状态副本。只有少数事件,这种复制和扫描开销是微不足道的,而且这种好处不存在。

除非您需要扩展以处理数百个或更多 fd,否则只需坚持使用 select()。

如果您真的要处理很多 fd,并且必须同时支持 Linux 和 Solaris,请考虑使用类似 libevent 的库。或 libev抽象出特定于内核的高效等待 API。

关于c - c 中使用轮询的套接字连接超时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7513348/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com