//接受远程服务器并转发到客户端
if(FD_ISSET(it->second.sockSrv, &Fd_Read))
{
ZeroMemory(RecvBuf,sizeof(RecvBuf));
nRecv = recv(it->second.sockSrv, RecvBuf, sizeof(RecvBuf), 0);
if(nRecv < 0)
{

}
else if ( nRecv == 0)
{
int nConde = WSAGetLastError(); if (nConde == 0)
{ 这里是为什么? }
else
{
}
}
msdn说返回0,就是连接断开,select()后 监测io事件后 发现recv() = 0. 我认为是连接关闭,但是实际上这个连接好像并没有关闭。(客户的网络环境,根据调试信息判断的)

解决方案 »

  1.   

    getlasterror返回0的话,一般表示没有发生错误;
      

  2.   


    是哦,一个客户度的插件下载,如果recv=0,error=0时关闭连接,结果他的插件就下载失败了:( 
      

  3.   

    recv返回0以后,你调用closesocket关闭连接了没?
      

  4.   

    lz,你觉得你的想法对吗?
    对于与客户端通信的套接字,用FD_ISSET 是不起作用的所以加不加都一样
    只能靠revc来判断, 是否套接字发生了变化(如:有数据发送给服务端),recv>0说明有数据<=0 叫做扯淡!!!当<=0的时候,那么就必须closesocket,并且FD_CLR 干掉这个套接字,http://topic.csdn.net/u/20120822/13/c6766433-0b3f-4929-9d65-f35ab8be948a.html顺便帮我看看这个帖子,谢谢了
      

  5.   

    lz  recv返回0是 断开?请出示msdn的原文,谢谢
      

  6.   


    close了 就出现了问题, 但是不close 这个socket就一直在我的检测队列里,导致cpu会比较高。
      

  7.   


    If no error occurs, recv returns the number of bytes received and the buffer pointed to by the buf parameter will contain this data received. If the connection has been gracefully closed, the return value is zero.Otherwise, a value of SOCKET_ERROR is returned, and a specific error code can be retrieved by calling WSAGetLastError.难道你都没有MSDN吗?
      

  8.   

    我是配合select来使用的……总不能把全部代码都贴上吧,代码全部贴上大家都没这个时间看别人的代码,又不是大神。
      

  9.   

    recv返回0是因为收到了FIN分节,所以返回0,表示对方主动关闭连接是不是服务器关闭socket了?
      

  10.   

    那就是关闭了,还有啥方法能证明未关闭,再send点东西试试
      

  11.   

    用wireshark抓包看一下这个tcp连接的状态变化情况。If the connection has been gracefully closed, the return value is zero.连接肯定是已经close了。