我找到了解决方案,为了在不丢失任何未交换数据的情况下关闭连接,您基本上应该使用SO_LINGER选项,这是一个非常长的故事,您可以在中看到详细信息
this article
最后,这里是新代码
UINT CNetServer::serveClient(LPVOID p)
{
serveClientParams* params = reinterpret_cast<serveClientParams*>(p);
try
{
AfxSocketInit();
CSocket clientSocket;
clientSocket.Attach(params->ClientSocket);
struct linger linger;
linger.l_linger = 9;
linger.l_onoff = 128;
int fls = 0;
int i = clientSocket.SetSockOpt(SO_LINGER, &linger, sizeof(linger));
i = clientSocket.SetSockOpt(SO_DONTLINGER, &fls, sizeof(fls));
CSocketFile file(&clientSocket);
CArchive arIn (&file, CArchive::load);
CArchive arOut(&file, CArchive::store);
params->ServerInstance->Consumer.Consume(arIn, arOut);
arOut.Flush();
//BOOL b = clientSocket.ShutDown(SD_BOTH);
}
catch(int ex)
{
CMisc::LogWriteWarning(ex, GetLastError(), "Listen Loop Communication");
}
catch(CException* ex)
{
char buffer[1024];
ex->GetErrorMessage(buffer, sizeof(buffer));
CMisc::LogWriteError(buffer, SOCKET_COMUNICATION_FAILED);
}
catch(...)
{
CMisc::LogWriteWarning(0, GetLastError(), "abnormal communication termination.");
}
delete params;
return 0;
}