accept一个socket以后,m_hSocket还在监听;
你不如在ACCEPT后直接开一个线程,处理对这个ACCEPT的套接口的操作;主线程将套接口作为参数传给新开的线程,然后主线程继续监听。即把你的WHILE放在子线程中。

解决方案 »

  1.   

    同意 lvqh(阻抗匹配) 的意见。
      

  2.   

    "不能马上处理的先保存的套接字到aSocket中,"你能保证这一点吗,上面的程序估计没有保障,在
    ret=recv(aSocket[SocketCount-1],buff,128,0);
    所在的循环未结束前,是无法执行
    aSocket[SocketCount]=accept(m_hSocket,NULL,NULL);的
    若这个循环执行时间过长,结果如何,不难想象另:....//create and bind m_hSocket
      ret=listen(m_hSocket,2);语句放在循环外就行了吧
    否则的话从第二次开始bind(),listen()返回的都是失败
      

  3.   

    是这样的,因为对每个socket的请求,我的程序必须是一个一个来处理的,如果用多线程的话会比较好吗?能较具体地帮忙写一下吗?
      

  4.   

    1、常规的办法是先创建一个daemon线程,专门用于监听,来一个accept一个,如果计数没有超过限你设定的限额的话。每创建一个socket,又为它创建一个thread,专门管理这个socket上的通讯,通讯结束时closesocket,线程结束;或者埋伏若干线程,有socket要处理时,选一个出来干活,没活儿都歇着。2、以上socket与thread一对一的方法,只适用于要管理的socket不多的时候,要是你有上百个socket,最好别这么干了,因为有太多的线程切换。这时候应该采用轮循的办法。一个thread管理若干个socket.我有个模糊的印象,select族函数好象只能对付64个以内的socket对象,超过64应该使用多个thread,一人分一点儿。对了,《WINDOWS网络编程技术》里面有讲,但不多。3、NO.1的办法相信大家都在用,NO.2可能就没有多少人见识过了。我也一样,只知道有这么回事,没有真的用过。
    希望有高人站出来,指点一二。
      

  5.   

    这样的情况其实是最常见的,以下是我的一个程序里用到的
    贴出来仅供参考:)UINT  HttpProxy(LPVOID pParam)
    {
    .................//define the member and accept the pParam

              //go.... //create
    MainSocket = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
    if(MainSocket == SOCKET_ERROR) 

    ParseError(ProxyDlg, "端口创建错误");
    return -2;

    Host.sin_family = AF_INET; 
    Host.sin_port = htons(port); 
    Host.sin_addr.s_addr = inet_addr(addr);
    //bind 
    if(bind(MainSocket, (SOCKADDR *)&Host, sizeof(Host)) != 0)

    ParseError(ProxyDlg, "HttpProxy: 绑定错误");
    return -3;
    }
    //listen
    if(listen(MainSocket,5) == SOCKET_ERROR) 

    ParseError(ProxyDlg, "HttpProxy: 监听错误");
    return -4;

    AddLen = sizeof(Client); 

    wsprintf(status, "HttpProxy: 代理服务器正常运行中...");
    ParseStatus(ProxyDlg, status);
    i = 0;
    ///
    fd_set fds;
    TIMEVAL timeout;
    int nError;
    /////////////////////////////////////
    wsprintf(status,"HttpProxy: wait request...");
    ParseStatus(ProxyDlg, status);
    //wait request from client
    do 
    {
    //time out 
    timeout.tv_sec = 2;
    timeout.tv_usec = 0;
    // we use select to avoid blocking on accept forever.
    //  it 
    FD_ZERO(&fds);
    FD_SET(MainSocket, &fds); //MainSocket+1  ???
    nError = select(MainSocket, &fds, NULL, NULL, &timeout);
    if(nError==WSAEINTR)
    {
    ParseError(ProxyDlg, "WSAEINTR");
    continue; //interrupted: no harm done
    }
    else if(nError<0)
    {ParseError(ProxyDlg, "nError");
    return 0; //error
    }
    if(FD_ISSET(MainSocket, &fds)==0)
    {
    //ParseError(ProxyDlg, "HttpProxy: timeout");
    continue;
    }
    //accept it
    ClientSocket = accept(MainSocket, (SOCKADDR *)&Client, &AddLen); if(ClientSocket == SOCKET_ERROR) 

    ParseError(ProxyDlg, "HttpProxy: 接受客户请求错误");
    continue;
    }
    wsprintf(status,"beginthread...");
    ParseStatus(ProxyDlg, status);
    i ++ ;
    if( i >= 1000) 
    i = 0; 
    Global[i] = ClientSocket; 

    //set the thread parameter
    memset(&threadRequest, 0, sizeof(threadRequest)); threadRequest.ProxyDlg = threadProxy->ProxyDlg;
    threadRequest.pSocket = (void*)&Global[i];
                   //all ready, we create thread to process the request of the client
                   //you can use it to instead your while loop
    AfxBeginThread(HttpRequest, &threadRequest); 
    // ::Sleep(100);
    }while(threadProxy->bInThread); wsprintf(status, "CloseSocket");
    ParseStatus(ProxyDlg, status);
    closesocket(MainSocket);
    return 0;

    }
      

  6.   

    看不太清楚,可以把你的完整发给我参考一下吗?谢谢
    my email:[email protected]
      

  7.   

    你应该做两个socket类,一个用来舰艇,一个用来连接。没收到一个连接就new一个连接类对象。
      

  8.   

    to:xintiaf(日月紫光) 
    我是比较笨的说,可是我还是不明白:你怎样控制global[i+1]在global[i]后处理的?
      

  9.   

    明显处理global[i+1]的线程在处理global[i]的线程创建之后才创建
    这个顺序这么重要啊
    你都说了“后一个请求的数据接收与否不需要考虑前一个请求的数据是不是接收完”:)
    global是个全局的SOCKET型数组