gpt4 book ai didi

sockets - 在 Metro 中处理套接字创建/销毁时的泄漏

转载 作者:行者123 更新时间:2023-12-03 11:54:22 34 4
gpt4 key购买 nike

我正在尝试在 Windows 8 Metro 下编写网络应用程序。
我的应用程序需要在运行时创建/销毁一些套接字。在尝试研究 WinRT 的网络 API 时,我发现了以下问题 - 我的进程在创建/销毁套接字时不断增加它的句柄数。
为了确认我写了以下示例:

task<void>( []()
{
// <checkpoint 1>

for(int i=0; i < 200; i++)
{
// create socket
DatagramSocket ^socket = ref new DatagramSocket();

// perform binding operation synchronously
HRESULT hr = S_OK;
HostName ^localHostName = ref new HostName(L"127.0.0.1");
String ^localServiceName = L"10000";

create_task( socket->BindEndpointAsync(localHostName, localServiceName) ).then(
[&hr] (task<void> previousTask)
{
try
{
previousTask.get(); // get exception
}
catch (Exception^ exception)
{
hr = exception->HResult;
}
}).wait();

ASSERT( SUCCEEDED(hr) );

// close socket
delete socket; // C++ version of DatagramSocket.Close(), see MSDN
socket = nullptr;
}

// <checkpoint 2>
});

此任务在主 App 的线程中创建。
我已经设置了 2 个断点并在那里运行 Sysinternal 的 Handle 实用程序:

在检查点 1(在开始创建/销毁循环之前):
Handle type summary:
ALPC Port : 10
Desktop : 1
Directory : 4
EtwRegistration : 34
Event : 40
File : 3
IoCompletion : 2
Key : 17
Mutant : 1
Section : 5
Semaphore : 4
Thread : 9
Timer : 7
TpWorkerFactory : 2
WaitCompletionPacket: 7
WindowStation : 2
Total handles: 148

在检查点 2(循环之后):
Handle type summary:
ALPC Port : 9
Desktop : 1
Directory : 4
EtwRegistration : 40
Event : 80
File : 5
IoCompletion : 145
Key : 20
Mutant : 1
Section : 5
Semaphore : 6
Thread : 26
Timer : 291
TpWorkerFactory : 144
WaitCompletionPacket: 295
WindowStation : 2
Total handles: 1074

据此,我的应用程序不断泄漏 Timer、WaitCompletionPacket 和其他句柄。
(我试图在循环后等待一段时间或在循环中插入延迟,希望工作人员能够完成他们的工作,但没有帮助)。
那么这个示例有什么问题,我应该如何创建/绑定(bind)/销毁套接字对象?
我正在使用 Windows 8 Consumer Preview,构建 8400。

最佳答案

正如 Andy 所提到的,在将 Windows 8 Consumer Preview 更新到 Windows 8 RTM(以及 Visual Studio)之后,该问题就消失了。

关于sockets - 在 Metro 中处理套接字创建/销毁时的泄漏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11987718/

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