私は小さなテスト用のtcpリスナーを作成しました。上記のリスナーはポート28328をリッスンし、クライアントが接続するたびに発生する巨大なリソース/メモリリークを予想して素晴らしい動作をします。C++ Winsock Acceptメモリリーク/リソースリーク
#include <stdio.h>
#include <winsock2.h>
#pragma comment(lib, "ws2_32.lib")
SOCKET Socket = INVALID_SOCKET;
bool TestServer()
{
WSADATA wsaData = { 0 };
if (WSAStartup(MAKEWORD(2, 2), &wsaData))
return false;
sockaddr_in addr = { 0 };
Socket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
int Enable = 1;
setsockopt(Socket, SOL_SOCKET, SO_REUSEADDR, (const char*)&Enable, sizeof(int));
addr.sin_family = AF_INET;
addr.sin_port = htons(28328);
addr.sin_addr.s_addr = INADDR_ANY;
if (bind(Socket, (sockaddr*)&addr, sizeof(sockaddr)))
return false;
if (listen(Socket, 50))
return false;
return true;
}
void Dolisten()
{
if (TestServer())
{
sockaddr_in addr = { 0 };
SOCKET Client_Socket = 0;
int Lenght = sizeof(addr);
for (;;)
{
Client_Socket = INVALID_SOCKET;
Client_Socket = accept(Socket, (struct sockaddr *)&addr, &Lenght);
if (Client_Socket == INVALID_SOCKET)
continue;
printf("Client Connected %X\n", Client_Socket);
shutdown(Client_Socket, 2);
closesocket(Client_Socket);
}
}
}
int main(int argc, char* argv[])
{
Dolisten();
WSACleanup();
return 0;
}
元リスナーはこれよりもはるかに大きいと、おそらく私は今、この私の最大の問題のように、まだにもらっていない多くの問題がありますが。
私は、ソケットの受け入れの結果として問題が発生し、それが正しく閉じずにハンドルリークに漏れたと考えます。私は、プロセスを監視するタスクマネージャーやその他のツールを見たとき、私の接続が発生したのと同じ割合でハンドル数が増えるのが分かります。
注:
1)その様子によってはリークが非ページメモリに発生します。
2)Linux環境でコンパイルされて使用された場合と同じコードスニペットでは、同じメモリ/リソースリークが発生しません。
3)このコードを複数のWindowsマシンでコンパイルしてテストしましたが、同じ問題が発生します。
4)(EDIT)MSDNフォーラムやVSフォーラムに掲載されたこの問題を抱えている人が2人いましたが、チケットを提出するだけでした。
"コンパイルしてLinux環境で使用する場合、これと同じコードスニペット"あなたのコードはWinAPI固有であり、Linux環境でネイティブにコンパイルまたは実行されません。 – tambre
@tambre私が知っているように、これはここに投稿するテストリスナーです。これはオリジナルのコードではなく、オリジナルのコードはWindowsとLinuxでコンパイルできます。 元のコードではないにもかかわらず、この問題は依然として存在します。より具体的ではないことを申し訳ありません。 –
@Aseshはい、私はここでそれを逃したが、私は元のコードはonexitにそれが含まれていることを保証することができます –