自己写的一个简单的聊天室程序,采用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;
}
if(networkEvents.iErrorCode[FD_CLOSE_BIT]!=0)
{
printf("FD_CLOSE failed with error %d \n\n",networkEvents.iErrorCode[FD_CLOSE_BIT]);
break;
}
{
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???
如果客户端断开的话,服务端肯定也会处理FD_CLOSE,并且把这个套接字的相关资源和套接字清理
.这种情况通常是连接的一方客户端(服务器端),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语句注释掉