没有用到MFC的SOCKET类库,自己封装了SOCKET API,开启了多线程ACCEPT(多线程)、SEND(多线程)、RECV(多线程)。问题是ACCEPT使用很正常,但是RECV用起来不是很正常,怎么判断RECV有数据进来,自启动。
还有就是在网上看到SELECT模型,对这个不是很懂(有没有必要用到这个)
请大家给简单讲讲

解决方案 »

  1.   

    你用的阻塞模型?recv没有接收到数据?
      

  2.   

    recv和send就不用多线程了,或者select,或者非阻塞
      

  3.   

     如果用阻塞模式,那么程序运行到RECV这里就会在这里阻塞,当有数据到达后才会继续向下运行。
      

  4.   

    用的非堵塞模型,RECV第一次可以接收到东西,但是(同样的套接字)第二次就不能接收了。
    我现在想实现一对多的连接,是不是用到SELECT模型是最理想的选择
      

  5.   

    阻塞模型好,还是非阻塞模型好
    还有就是想实现一个,当有数据进来的时候,启动RECV接收数据
      

  6.   

    方法一:
    #define WM_SOCKET   WM_USER+101
    ON_MESSAGE(WM_SOCKET,OnSocket);
    LRESULT OnSocket(WPARAM wParam, LPARAM lParam);
    ...    SOCKET sockListen
        SOCKET sockClient;
        sockListen = socket(...);
        WSAAsyncSelect(sockListen,WM_SOCKET,...);
        ...
    LRESULT XXX::OnSocket(WPARAM wParam, LPARAM lParam)
    {
        switch(WSAGETSELECTEVENT(lParam))
        {
        case FD_ACCEPT:   //有连接请求
             sockClient = accept();
            WSAAsyncSelect(sockClient ,WM_SOCKET,...);
            break;
        case FD_RECV:   //有数据进来         
             recv(...);
            break;
        case FD_Send:  
            break;
        case FD_CLOSE:   //有关闭         
             CloseSocket(...);
            break;
        }
    方法二:使用Select;
        创建一个线程
    DWORD WorkThread(LPVOID lParam)
    {
        FD_ZERO(&fdsr);                   //清除一个文件描述符集
         FD_SET(sockclient, &fdsr);        // 把SOCKET加入到文件描述符集合    int nRet = select(maxsock + 1, &fdsr, NULL, NULL, &timeout);    if (nRet < 0)
        {
            cout<<"select !error"<<endl;
    break;
        }
        else if (nRet == 0)
        {
    cout<<"timeout"<<endl;
    continue;
        }
        if (FD_ISSET((SOCKET)lpParam,&fdsr))
        {
            nRet = recv(sockclient,buffer,256,0);
    f (nRet<=0)
            {
        m_pThis->DeleteOneClient(sockclient);
        return 0;
    }
    else            //接收数据成功
    {
                数据处理
            }
        }
    }