自己写的一个简单的聊天室程序,采用WSAEventSelect模型,当客户端发来数据时,服务器响应FD_ACCEPT和FD_READ消息,能正确接收到数据;但是,当客户端断开连接,服务器端产生FE_CLOSE消息时,服务器端也会断开,查看出错码为10053  这个问题一般会是由于什么造成的呢!?
         if(networkEvents.iErrorCode[FD_CLOSE_BIT]!=0)
         {
           printf("FD_CLOSE failed with error %d \n\n",networkEvents.iErrorCode[FD_CLOSE_BIT]);
        break;                                     
         }

解决方案 »

  1.   

    wsaeconnaborted           (10053)             software caused connection abort. 一个已建立的连接被你的主机上的软件终止,可能是因为一次数据传输超时或是协议错误。
      

  2.   

    你的shutdown和closesocket都在哪里处理呢
      

  3.   

    if(networkEvents.lNetworkEvents&FD_CLOSE)
           {
             if(networkEvents.iErrorCode[FD_CLOSE_BIT]!=0)
             {
               printf("FD_CLOSE failed with error %d \n\n",networkEvents.iErrorCode[FD_CLOSE_BIT]);
               printf("At FD_CLOSE Process ,the Index is %d ,and the WSA_WAIT_EVENT_0 is %d \n\n",Index,WSA_WAIT_EVENT_0);
                break;                                     
             }
             printf("FD_CLOSE Signal received! \n");
             
             closesocket(Socket[Index-WSA_WAIT_EVENT_0]);
                               
           }  
     当FD_CLOSE消息没报错,紧跟着就执行closesocket,有什么问题吗?
       shutdown?? 不理解,还要处理shutdown???
      

  4.   

    但是,当客户端断开连接,服务器端产生FE_CLOSE消息时,服务器端也会断开?你期望的情况是怎样的?
    如果客户端断开的话,服务端肯定也会处理FD_CLOSE,并且把这个套接字的相关资源和套接字清理
      

  5.   

    服务端处理一个FD_CLOSE之后,应该把对应的socket关闭,并且从socket数组里删除,对应的事件对象也要从数组里删除掉
      

  6.   

    to lz  #先说说为什么会出现10053错误
      .这种情况通常是连接的一方客户端(服务器端),close连接后;连接的另一方服务器端(客户端)的socket发送缓冲区里边还有“未确认”的数据,导致服务器端的tcp协议栈会重新发送这些数据;然而客户端socket对方已经关闭了,并且丢弃了它的socket接受缓冲区的数据。导致服务器端的tcp协议栈向上层应用返回 10053错误。  如果你这个时候用wireshark抓一下包,应该会看到客户端可能会发送一个tcp rst分段过来!怎么样解决close的时候数据丢失就是另外一个话题了  #服务器一直运行?
      .要想使服务器一直运行,就要在发生非致命错误的时候不要跳出你的循环!从而终止你的应用
       if(networkEvents.iErrorCode[FD_CLOSE_BIT]!=0)
       {
          printf("FD_CLOSE failed with error %d \n\n",networkEvents.iErrorCode[FD_CLOSE_BIT]);
          printf("At FD_CLOSE Process ,the Index is %d ,and the WSA_WAIT_EVENT_0 is %d \n\n",Index,WSA_WAIT_EVENT_0);
          break;                                     
        }
        printf("FD_CLOSE Signal received! \n");    把你上边的break语句注释掉
      

  7.   

    我的出现的更奇怪:使用完成端口,在xp系统正常,客户端运行到win7系统就会在连接上几秒后出现10053错误。抓包查看发现客户端发送了RST数据包,求高手解决。