是否有可能无法获得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.
}
没有找到相关结果
已邀请:
2 个回复
怪酞撩匹
关闭完成呼叫的完成次数? 您是否正在对您的发送进行任何形式的流量控制,或者只是在您想要的时候和您想要的频率发送?你可能会看到的只是一个SLOW完成,因为TCP堆栈正在进行拥塞控制而无法发送你的数据。如果您继续以不受控制的方式发送数据,您通常会遇到完成时间越来越长的情况。特别是如果您以比TCP连接成功获取数据的速度更快的速度发送数据,特别是如果TCP窗口不是那么大。有关更多信息,请参见http://www.lenholgate.com/blog/2008/07/write-completion-flow-control.html。 当然它可能只是你的发送逻辑中的一个错误,你可以发布一些代码吗? 请注意,当使用
时,WSARecv()和UDP存在一个已知错误(因此根本没有与您的问题无关),这给出了您描述数据报是否大于您提供的缓冲区并且
调用将具有的情况产生了
;请参阅:http://www.lenholgate.com/blog/2010/01/file-skip-completion-port-on-success-and-datagram-socket-read-errors.html
傻零凰死授
结构的有效
的低位,可以防止发布完成端口: 来自
的文档: 即使你已经通过了这个功能 与a关联的文件句柄 完成端口和有效的OVERLAPPED 结构,应用程序可以防止 完成端口通知。这是 通过指定有效事件来完成 处理hEvent成员的 OVERLAPPED结构,并设置它 低位。有效的事件句柄 其低位设置保持I / O. 从排队到完成 完成港口。