작은 테스트 용 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 포럼에 게시 한이 정확한 문제로 몇 사람을 보았지만 티켓을 제출하라는 메시지가 모두 들었습니다.
"이 코드는 Linux 환경에서 컴파일되고 사용되는 경우 동일한 코드 조각입니다."이 코드는 WinAPI에 고유하며 Linux 환경에서 기본적으로 컴파일되거나 실행되지 않습니다. – tambre
@tambre 여기에 게시 할 테스트 리스너라고 말한 것처럼 원래 코드는 아니며 Windows 및 Linux에서 원본 코드를 컴파일 할 수 있습니다. 원본 코드가 아니더라도 문제가 계속되는 것을 명심하십시오. 더 구체적이지 않아서 미안해. –
@Asesh 예, 여기서 그립습니다.하지만 원래 코드에는 onexit이 포함되어 있음을 확신 할 수 있습니다. –