gpt4 book ai didi

c - 是否有可能没有收到 WSASend 调用的完成?

转载 作者:可可西里 更新时间:2023-11-01 02:40:20 26 4
gpt4 key购买 nike

如标题所示,在与 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.
}

最佳答案

您是否正在使用任何时髦的新功能,例如使用 FILE_SKIP_COMPLETION_PORT_ON_SUCCESS 关闭成功调用的完成?

您是否对您的发送进行了任何形式的流量控制,或者您只是在您想要的时候随时发送,想发送多少就发送多少?你可能看到的只是一个缓慢的完成,因为 TCP 堆栈正在进行拥塞控制并且还不能发送你的数据。如果您继续以不受控制的方式发送数据,您通常会遇到这样一种情况,即完成时间开始变得越来越长。特别是如果您发送数据的速度比 TCP 连接成功地将数据发送到另一端时,尤其是在 TCP 窗口不是那么大的情况下。看这里:http://www.lenholgate.com/blog/2008/07/write-completion-flow-control.html了解更多信息。

当然,这可能只是您发送逻辑中的错误,您能发布一些代码吗?

请注意,在使用 FILE_SKIP_COMPLETION_PORT_ON_SUCCESS 时,WSARecv() 和 UDP 存在一个已知错误(因此与您的问题完全无关),如果数据报大于您提供的缓冲区和 WSARecv() 调用将生成一个 WSAEMOREDATA;看这里:http://www.lenholgate.com/blog/2010/01/file-skip-completion-port-on-success-and-datagram-socket-read-errors.html

关于c - 是否有可能没有收到 WSASend 调用的完成?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5486676/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com