本帖最后由 oyljerry 于 2012-04-20 10:34:58 编辑

解决方案 »

  1.   

    1.不停select进行send或recv数据
    2.FD_SET(s, *set):将套接字s加入集合set。
    3.确定套节字有多少未决I/O。因为这个集合里只有 mainsock ,所以就不用调用fd_array了
    4. mainsock 在前面的socket()方法里已经赋过值了,就不需要再赋值了。如果同时来了5个连接请求的话,这5个socket都能到fdset结构里去。
      

  2.   

    1:不停的select就像你到你家邮箱看看有没有你的信一样。select会告诉你有没有数据到来,有没有数据发送?
    2:说法1:FD_SET(s, *set):将套接字s加入集合set。其实set内部就是一个数组,lz可以打开mfc的代码看下。
    3:要不要for循环一样,只需要if(FD_ISSET(mainsock,&fdread))就ok了。
    4:你没有调用FD_SET(s, *set)就不会进去,应该是到你们通讯的线程里面了。//...为clientSocket创建一个新的线程,在新的线程中再不停的select
    有这个线程统一处理了。
      

  3.   

    1、所谓不停的Select是指处理了一个Select请求后马上等待处理下一个,这不正是我们所希望的么
    2、这个其实就是维护secket,看不懂的不用管,按说法一理解即可
    3、for循环的目的是冗余处理,主要目的是掉有可能占用的资源
    4、mainsock本来就不用重新赋值,同时处理时没有问题的
      

  4.   


    for(int i=0;i < fdread.fd_count-1;i++)
    {
    len = sizeof(sockaddr_in);
    clientSocket = accept(mainsock, 
    reinterpret_cast<sockaddr*>(&serviceaddr_info),&len);
    if(clientSocket != INVALID_SOCKET)
    {
    //CreateThread(&scrt,0,&SelectProc,
    //...为clientSocket创建一个新的线程,在新的线程中再不停的select
    }
    }
    那在新线程的select里,FD_SET(s, *fdset)的 s 是这里的clientSocket,fdset则是一个新的吧,不是这里的fdread是不是?