套接字超时:它可以工作,但是为什么以及如何工作,主要是select()函数?

套接字超时:它可以工作,但是为什么以及如何工作,主要是select()函数?,c,sockets,select,timeout,C,Sockets,Select,Timeout,这是我现在使用的部分代码 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_se

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

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选择:

nfds是三个集合中编号最高的文件描述符,加上1,这就是为什么sockfd+1。 select返回触发请求事件的描述符数。只给出了一个描述符,因此select最多只能返回1。 因此,如果在3秒之后,给定的超时,没有发生任何事情,选择不返回1,所以您认为这是超时。不处理错误-1的情况。
阅读select的文档时,您了解到了什么?我还没有真正了解,抱歉,我主要从事嵌入式开发,需要为简单通信编写一个快速的pc程序。在撰写此评论时,我正在阅读select函数的msdn页面。我想我可以用它来检查套接字的状态,就像伪代码一样。想弄清楚是怎么回事。我马上就到了:man 3 select是指手册第3节的库功能。实际上,你应该阅读第2节,系统调用。如果给定关键字出现在多个章节中,则为手册中的章节。-3代表程序库中的库调用函数。我修复了我的文本。man 3 select实际显示FD_SET3手册,其中也包含select。我想这就是我得到3的原因。我现在正在阅读关于它的文档,您所说的只有一个描述符,所以select最多可以返回1。您指的是上面选择呼叫中的第三个选项吗?选择sockfd+1、NULL和&fdset、NULL和电视,然后选择&fdset。那么这个函数是否检查套接字是否可写?如果我这样做:选择sockfd+1、&fdset2、&fdset、NULL和tv,它会检查可写性和可读性,并返回一个从-1到2的可能值范围吗?这也是我检查我提到的那些标志的方法吗?nfds是select的第一个参数。如果未安装手册,请联机阅读:。