gpt4 book ai didi

c - 套接字超时: It works, 但为什么以及如何,主要是 select() 函数?

转载 作者:行者123 更新时间:2023-11-30 16:01:15 24 4
gpt4 key购买 nike

这是我现在使用的代码的一部分。

fd_set fdset;
struct timeval tv;
int flags = fcntl(sockfd, F_GETFL);
fcntl(sockfd, F_SETFL, O_NONBLOCK);

connect(sockfd,(struct sockaddr *)&serv_addr,sizeof(serv_addr));

FD_ZERO(&fdset);
FD_SET(sockfd, &fdset);
tv.tv_sec = 3;
tv.tv_usec = 0;

if (select(sockfd + 1, NULL, &fdset, NULL, &tv) == 1)
{
int so_error;
socklen_t len = sizeof so_error;
getsockopt(sockfd, SOL_SOCKET, SO_ERROR, &so_error, &len);
if (so_error == 0) {
cout << " - CONNECTION ESTABLISHED\n";
}
} else
{
cout << " - TIMEOUT\n";
exit(-1);
}

我不清楚 select() 函数是如何工作的,这里的伪代码才是我真正想做的,

    bool showOnce = true;

connect(sockfd,(struct sockaddr *)&serv_addr,sizeof(serv_addr))
while(stillConnecting) /*Some kind of flag of connection status*/
{
if(showOnce)
{
showOnce = false;
cout << "Connecting";
}
}

if(connected) /*Another possible flag if it exists*/
return true;
else
return false;

是否有办法实现这个伪代码,这些标志是否存在?

编辑:另外为什么上面代码中的 select 函数中是 sockfd+1 ?为什么要加一个呢?

最佳答案

阅读手册:man 2 select:

  1. nfds 是这三个集合中编号最高的文件描述符,再加上 1。,这就是 sockfd + 1 的原因。
  2. select() 返回触发请求事件的描述符数量。仅给出一个描述符,因此 select 最多可以返回 1
  3. 因此,如果在给定的超时时间 3 秒后没有任何反应,select() 不会返回 1,因此您认为这是超时。错误-1的情况不会被处理。

关于c - 套接字超时: It works, 但为什么以及如何,主要是 select() 函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6932512/

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