就像标题所说,是有可能的成功WSASend
呼叫与I/O完成端口相关联的未张贴比结束线程之外的其他原因完成一个插座上?是否有可能无法接收WSASend调用的完成?
我有一种奇怪的情况:它看起来像一个完成没有被公布为WSASend
,这导致插槽泄露;应用程序认为发送仍然等待套接字并拒绝发布它。
的发送代码如下:
void CSocketServer::Write(
Socket *pSocket,
CIOBuffer *pBuffer) const
{
pSocket->AddRef();
pBuffer->SetOperation(IO_Write_Completed);
pBuffer->SetupWrite();
pBuffer->AddRef();
DWORD dwFlags = 0;
DWORD dwSendNumBytes = 0;
if (SOCKET_ERROR == ::WSASend(
pSocket->m_socket,
pBuffer->GetWSABUF(),
1,
&dwSendNumBytes,
dwFlags,
pBuffer,
NULL))
{
DWORD lastError = ::WSAGetLastError();
if (ERROR_IO_PENDING != lastError)
{
pSocket->OnConnectionError(WriteError, pBuffer, lastError);
pSocket->WriteCompleted(); // this pending write will never complete...
pSocket->Release();
pBuffer->Release();
}
}
// Note: even if WSASend returns SUCCESS an IO Completion Packet is
// queued to the IOCP the same as if ERROR_IO_PENDING was returned.
// Thus we need no special handling for the non error return case.
// See http://support.microsoft.com/default.aspx?scid=kb;en-us;Q192800
// for details.
}
我想我可能会使用你的服务器架构的5-7岁的,重大的修改版本。这不是一个缓慢完成,因为没有拥塞,但我看到一些永远不会被释放的套接字。倾销他们表明他们有一个参考和一个杰出的写作。如果我等待24小时并再次倾倒它们,这些插座仍然存在。这可能是一个逻辑上的错误,我似乎无法找到它。 – 2011-03-31 11:43:49
我不提供对免费代码的支持,甚至更少;)对于它的重大修改版本,但它听起来像是一个逻辑错误。发布发送发送的代码? – 2011-03-31 12:22:57
虽然我粘贴了“写入”功能,但我不确定它有多少是你的。另一个线程向I/O线程发布'IO_Write_Request'操作,并处理它并输入此函数。 – 2011-03-31 13:20:08