while(1)
{
ret = recv(sock,szbuff,1024,0);
if(ret == 0)
break;
else if(ret == SOCKET_ERROR)
{
cout << "recv() failed " << WSAGetLastError() << endl;
break;
}
szbuff[ret] = '\0';
cout << "recv " << szbuff << " " << ret << "bytes" << endl;
}
这段代码的问题在于,假如没有数据处于“待决”状态,那么 r e c v函数可能永远都无法返回。
------------------------------------
以上是windows网络编程书上的原话,我是这么理解的,提供给recv函数的反冲区要从协议的反冲区中读点数据后,recv才会返回,而这个“待决”状态就是说你现在可以读了,没有数据处于“待决”状态就是说读不了数据,这有可能是协议或者说套接口的反冲区里没有数据,或者说数据没有达到足够的字节数量所以不让读入到提供的反冲区中
不知道是不是这个意思

解决方案 »

  1.   

    这段代码的问题在于,假如没有数据处于“待决”状态,那么 r e c v函数可能永远都无法返回。
    ----------------
    待决,你可以从字面意思来理解就是数据已经准备好,等待处理了。 :)
      

  2.   

    TCP反冲区和提供给recv函数的反冲区之间的关系是怎么样的呢?我迫切需要知道这个是怎么回事
      

  3.   

    应该是TCP系统缓冲区和用户自定义的缓冲区。如果你没有调用setsockopt(...SO_RCVBUF,...)将TCP缓冲区buf设置为0的话,协议接收到数据以后,就将该数据放置在系统缓存区,recv函数将系统缓冲区的数据copy到用户定义的缓冲区中。