在套接字 C++ 中选择不起作用

Posted

技术标签:

【中文标题】在套接字 C++ 中选择不起作用【英文标题】:Select in socket c++ doesn't work 【发布时间】:2014-12-30 09:26:32 【问题描述】:

我创建了一个实现tcpsocket的select函数的类。 (listenSock 是 TcpSocket 的向量 - 有效) 我不明白为什么但是第二次选择被称为程序停止工作。

TCPSocket* MultipleTCPSocketsListener::listenToSocket()
    //TODO: create local set for the select function (fd_set)
    fd_set set;
    FD_ZERO (&set);
    FD_SET (0, &set);

    //TODO: fill the set with file descriptors from the socket list using (FD_SET macro)
    for ( int i = 0; i < listenSock.size(); i++ )
    
        FD_SET (listenSock.at(i)->getSock(), &set);
    

    //TODO: perform the select
    int sel=select(sizeof(set)*8,&set,NULL,NULL,NULL);

    //TODO: check the returned value from the select to find the socket that is ready
     if (sel==-1) 
          perror("select failed");
          return NULL;
     

    //TODO: if select return a valid socket return the matching TCPSocket object otherwise return NULL
     if (sel > 0)
     
         for ( int i = 0; i < listenSock.size(); i++ )
         
             if (FD_ISSET(listenSock.at(i)->getSock(), &set)) return  listenSock.at(i);
         
     
    return NULL;

【问题讨论】:

【参考方案1】:
FD_SET (0, &set);

没用。您指示 select 将 stdin 视为要监视的套接字之一。

【讨论】:

那我应该怎么做呢?还是直接删除这一行? 完全正确。删掉就好了。 为什么你认为 0 是标准输入而不是空套接字描述符? fd 0stdin - 关于 Linux 必须了解的许多事情之一。 en.wikipedia.org/wiki/File_descriptor @o_weisman:因为我看到更多没有专有名称的用户提出的问题,并且根据我的经验,不倾向于故意做事。因此,我认为帮助他的最好方法是:假设他是无意中这样做的,并表明它的正确性。

以上是关于在套接字 C++ 中选择不起作用的主要内容,如果未能解决你的问题,请参考以下文章

从不同线程在同一个套接字上发送和接收不起作用

useEffect 中的套接字连接事件在创建组件时不起作用,但在 React 中刷新页面后起作用

套接字在发布版本中不起作用 React Native

rename() 在使用 Dev C++ 编译的 C 程序中不起作用

套接字通信在 localhost 中不起作用

将密码与套接字 java 一起使用,不起作用