我在使用一个send发送一个大的数据的时候,系统会对我的窗口发送一个FD_READ消息,因为数据很大所以我一次recv无法全部取出,所以我使用下面的代码。
   int err = recv(socket,(char*)p,size,0);
  while(err != size)
{
    int temp = recv(socket,(char*)(p+err),size-err,0);
    err += temp;
}
我跟踪调试的时候运行的很好,但是非调试使用就会出问题,我查询了一下文档,MSDN上说在FD_READ里只能使用一个recv,那么我应该怎么办呢?

解决方案 »

  1.   

    楼上的可是我试过了    用udp的 时候
    程序会死在那里,cpu马上就100%,我找了一下原因
    FD_READ

    recvfrom
    发生了死循环 
    如何解决?
      

  2.   

    FD_READ

    recvfrom
    发生了死循环 
    ---------------------察看一下收到的数据啊,不会死循环吧。没有设MSG_PEEK吧 ?
      

  3.   

    int err = recv(socket,(char*)p,size,0);
      while(err != size)
    {
        int temp = recv(socket,(char*)(p+err),size-err,0);
        err += temp;
    }------------------------------------
    不要这样使用,否则你会死很掺的。
    肯定死循环啦
    看我的:  int err = recv(socket,(char*)p,1000,0);
      while(err == 1000)
    {
        int err = recv(socket,(char*)p,1000,0);
    }
      

  4.   

    建议千万不要用异步,用阻塞CSocket,不然你会死很掺。CSocket速度非常快,支持多线程,不占cpu.
      

  5.   

    我也遇到过这样的问题~我的解决方法是,有消息进入FD_READ的时候,先取消这个套接字的消息~然后用recv或者WSARecv接收数据,直到数据接收完整,再重新注册这个套接字的消息~
      

  6.   

    唉,有CSoket不用,人家不比你封装得好,效率高??我现在借助CSocet,OnReceive,用多线程接收数据,每个线程轻松突破
    100KByte/s,而且cpu<10%,你自己用异步,做不到吧??