你要再仔细的看一下select模型的用法。你的代码写的好像有点问题,使用了fd_set,为何没有使用select??1.首先要注意的是,如果要监测是否连结成功,应当监测readset,而非writeset.
2.select函数执行后会返回一个int n,意义是可以去读有几个socket的数据(这里只是考虑readset)。
3.你需要使用FD_SET来判别每个socket是否在返回的readset中。如果在,且
如果该socket的值正好和你listen socket相同,说明有连结,否则读数据。并将n--,直到n = 0

解决方案 »

  1.   

    select()函数,只要有一个socket连接成功就返回了,好像不会检测fd_set集合的所有socket,我要实现的功能是等待fd_set集合中的socket都检测完才返回,以确保是否所有的socket都已连接。
      

  2.   

    请你仔细看看select的用法罢。
    select返回的是所有当前可以读写的的socket的数目(包括异常)。
      

  3.   

    for (int i=0;i<5;i++)

       sock[i]=socket(PF_INET,SOCK_STREAM,0);
       ioctlsocket(sock[i], FIONBIO, (unsigned long*)&ul);//设成非阻塞模式   connect(sock[i],(struct sockaddr *)&sin,sizeof(SOCKADDR_IN));
          sleep(1000);
       FD_SET(sock[i], &fdswrite);

    ret=select(maxfd+1, 0, &fdswrite, 0, &timeout);
    那这样select()返回的ret会是多少呢,能不能根椐这个值来判断当前有多少socket已连接,其佘的不能连接呢
      

  4.   

    ret=select(0, &setReadSet, NULL, NULL, &timeout);
    while(ret){if(FD_ISSET(sock[i],&setReadSet)){
        if (sock[i] == nYourListenSocket){
                 accept(sock[i],....);
                 ret--;
        }
    }
      

  5.   

    偶不知道你想干什么??select之前,你需要填写所有你关心的socket"断当前有多少socket已连接,其佘的不能连接呢"这是什么意思?
      

  6.   

    给你一段偶的代码,供你参考void CChatServerApp::Run()
    {
    cout<<VersionInfo<<endl; /////////////////listen port////////////////////////////
    SOCKET nlistensocket = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP); sockaddr_in addr;
    addr.sin_family = AF_INET;
    addr.sin_port = htons(m_nListenPort);
    addr.sin_addr.S_un.S_addr = htonl(INADDR_ANY); if(bind(nlistensocket,(SOCKADDR*)&addr,sizeof(addr))){
    cout<<"Bind listen port failed."<<endl;
    return;
    }
    listen(nlistensocket,5);
    cout<<"Listen client connect on port:"<<m_nListenPort<<endl; ///////////////////console port///////////////////////////
    SOCKET nConsoleSocket = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
    sockaddr_in addr1;
    addr1.sin_family = AF_INET;
    addr1.sin_port = htons(m_nConsolePort);
    addr1.sin_addr.S_un.S_addr = htonl(INADDR_ANY); if(bind(nConsoleSocket,(SOCKADDR*)&addr1,sizeof(addr1))){
    cout<<"Bind listen port failed."<<endl;
    return;
    }
    listen(nConsoleSocket,5);
    cout<<"Listen Console connect on port:"<<m_nConsolePort<<endl; char buffer[1025]; //receive buffer space
    struct timeval timeinterval;
    timeinterval.tv_sec = 0;
    timeinterval.tv_usec = m_lmSecond; cout<<"Now,let's go ! :)"<<endl<<endl;
    while(1){
    //set the readset
    FD_ZERO(&m_setReadset);
    FD_SET(nlistensocket,&m_setReadset);
    FD_SET(nConsoleSocket,&m_setReadset);

    m_mtemp = m_mSocket2Name;
    SOCKET2ClientName_t ::iterator it;
    for(it = m_mtemp.begin(); it != m_mtemp.end(); it++)
    FD_SET((*it).first,&m_setReadset); m_mConsoletemp = m_mConsoleSocket;
    SOCKET_t :: iterator consoleit;
    for(consoleit = m_mConsoletemp.begin(); consoleit != m_mConsoletemp.end(); consoleit++)
    FD_SET((*consoleit).first,&m_setReadset);


    //now,let's find the socket! :)NULL);
    int num = select(0,&m_setReadset,NULL,NULL,&timeinterval);
    if(num <= 0 )
    continue;

    while(num > 0 ){
    //client connect request
    if(FD_ISSET(nlistensocket,&m_setReadset)){
    sockaddr acceptaddr;
    int nlen = sizeof(acceptaddr);
    SOCKET s = accept(nlistensocket,&acceptaddr,&nlen);
    if(s != SOCKET_ERROR){
    this->OnNewConnection(s,(sockaddr*)&acceptaddr);
    }else{
    cout<<"accept error. error code:"<<WSAGetLastError()<<endl;
    }
    num--;
    } //console connect
    if(FD_ISSET(nConsoleSocket,&m_setReadset)){
    sockaddr acceptaddr;
    int nlen = sizeof(acceptaddr);
    SOCKET s = accept(nConsoleSocket,&acceptaddr,&nlen);
    if(s != SOCKET_ERROR){
    Console_Welcome(s);
    }
    num--;
    } //console command
    for(consoleit = m_mConsoletemp.begin(); consoleit != m_mConsoletemp.end(); consoleit++){
    if(FD_ISSET((*consoleit).first,&m_setReadset)){
    int ret = recv((*consoleit).first,buffer,1024,0);
    if(ret > 0){
    buffer[ret] = '\0';
    OnConsoleCommand((*consoleit).first,buffer);
    }else{
    Console_Disconnect((*consoleit).first);
    }
    num--;
    }//if
    }//for(consoleit //notify data coming
    for(it = m_mtemp.begin(); it != m_mtemp.end(); it++){
    if(FD_ISSET((*it).first,&m_setReadset)){//find the socket which receive data
    int ret = recv((*it).first,buffer,1024,0);
    if(ret > 0){
    buffer[ret] = '\0';
    OnDoWith((*it).first,buffer);
    }else{
    OnCloseConnection((*it).first);
    }
    num--;
    }
    }//for }//while(num > 0 )
    }//while(1)
    }