当一个客户与服务器建立TCP连接之后,如何才能响应服务器发来的数据,然后做相应的处理,也就是这个recv()该写在哪里?客户不知道什么时候数据来,并且客户也随机的发数据过去。比如QQ. 我怎么不用 MFC也能实现呢?(避免消息)

解决方案 »

  1.   

    ?当然写在accept之后,可以用一个循环不断地收,嫌浪费资源的话就开个work线程单独收。
    你不用CSocket可以用winsock 2.0 api来做。
      

  2.   

    UINT CClientOverlappedSock::RecvThread( void *arglist )
    {
    ASSERT(arglist);
    CClientOverlappedSock *Socket=(CClientOverlappedSock *)arglist;
    WSANETWORKEVENTS NetworkEvents;
    HANDLE hEvent[2];
    hEvent[0] = Socket->m_hEventClient;
    hEvent[1] = Socket->m_hEventExit;
    while(1)
    {
    DWORD ret = WSAWaitForMultipleEvents(2,hEvent,FALSE ,WSA_INFINITE,FALSE);
    switch(ret) 
    {
    case 0:
    {
    ::WSAEnumNetworkEvents (Socket->m_RecSocket,NULL,&NetworkEvents);
    WSAResetEvent(Socket->m_hEventClient );
    switch(NetworkEvents.lNetworkEvents)
    {
    case FD_CLOSE:
    Socket->RemoteClose();
    break;
    case FD_READ:
    Socket->OnRead();
    break;
    default:
    break;
    }
    }
    break;
    case 1:
    return 0;
    break;
    default:
    break;
    }
    }
    return 0;
    }
      

  3.   

    连接之后,可以用一个select来设置信息的到来。
     有数据到达的时候再进行接收数据。
    fd_set readfds;                                                                                                 
        struct timeval timeval={300,0}; //300秒超时
    while(1)
    {
    FD_ZERO( &readfds)
          FD_SET(pDlg->m_serSock,&readfds); 
    ret = select(0,&readfds,NULL,NULL,&timeval); //300秒
    if(ret==SOCKET_ERROR)
    {
    TRACE("socket select  错误=%d!\n",WSAGetLastError());
    }
    break;
    }
    //等待超时,退出线程等待
    if(ret==0)
    {

    break;
    }
    if(ret>0) //有数据到达
    {
    n=recv(pDlg->m_serSock[sockid],buf,1023,0);
                       }

    }
      

  4.   

    to chqu18(bug)select是在一个新的线程下吗?
      

  5.   

    一般情况下,在接收之前要select一下
      

  6.   

    作一个循环一直等待接收,把recv()写在循环中,然后作一个判断,当某些条件满足时(比如断开连接,出错什么的),跳出循环